/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package Gestores;

import ClasesBase.Casillero;
import ClasesBase.Ferrocarril;
import ClasesBase.Jugador;
import ClasesBase.Propiedad;
import ClasesBase.ServicioPublico;
import ClasesBase.Tarjeta;
import Hilos.SocketServidor;
import DAO.CasilleroDAO;
import DAO.TarjetasDAO;
import Extras.HashTable;
import Extras.Mensajes;
import GUI.EnEsperaD;
import GUI.PrincipalF;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.table.DefaultTableModel;

/**
 *
 * @author Francisco
 */
public class GestorServidor {
    //DAO

    private final CasilleroDAO casilleroDao;
    //Interfaces
    private final PrincipalF principalF;
    private final TarjetasDAO tarjetaDao;
    private EnEsperaD enEspera;
    //Objetos de clase
    private final SocketServidor socketServidor;
    //Variables
    private HashTable casilleros;
    private HashTable tarjetasSuerte;
    private HashTable tarjetasArcaComunal;
    private int contJugadoresComienzo;//Se usa para saber cuando todos los  jugadores reportaron sus resultados de comienzo de dados.
    private int jugadorTurnoActual;
    private final LinkedList<Jugador> jugadores;
    private final LinkedList<String> piezas;
    private int contadorSuerte;
    private int contadorArca;
    private boolean todoOk;
    private boolean esDoble;
    private int contadorDado;
    private int keyTarjetaSuerte;
    private int keyTarjetaArca;
    private String idTerrenoEnSubasta;
    private String nickDuenioPagar;
    private int alquilerAPagar;
    /**
     * Hace referencia al mensaje que va dirigido al jugador que hizo la llamada
     * al servidor (nickname)
     */
    private String mensajeEnParticular;
    /**
     * Hace referencia al mensaje que va dirigido a TODOS los jugadores.
     */
    private String mensajeATodos;
    /**
     * Hace referencia al mensaje que va dirigido a TODOS con excepción del
     * jugador que hizo la llamada al servidor (nickname)
     */
    private String mensajeSinParticular;
    private LinkedList<Integer> propiedadesASubastarPorBancarrota;
    private boolean subastaPorBancarrota;

    public GestorServidor(PrincipalF principalF) {
        socketServidor = new SocketServidor(this);
        jugadores = new LinkedList<>();
        piezas = new LinkedList<>();
        this.principalF = principalF;
        this.casilleroDao = new CasilleroDAO();
        this.tarjetaDao = new TarjetasDAO();
        this.llenarPiezas();
        this.contadorSuerte = 1;
        this.contadorArca = 1;
        this.contadorDado = 0;
        this.esDoble = false;
        this.keyTarjetaSuerte = 1;
        this.keyTarjetaArca = 1;
        this.mensajeATodos = "";
        this.mensajeEnParticular = "";
        this.mensajeSinParticular = "";
        this.nickDuenioPagar = "";
        this.alquilerAPagar = 0;
        this.subastaPorBancarrota = false;
    }

    public void iniciarConexion() {
        socketServidor.start();
    }

    public void addJugador(String nickname) {
        int ran = (int) (Math.random() * piezas.size());
        Jugador j = new Jugador(nickname, piezas.get(ran));
        piezas.remove(ran);
        jugadores.add(j);
    }

    public synchronized void crearEnEspera(PrincipalF principal) {
        try {
            wait();
        } catch (InterruptedException ex) {
            Logger.getLogger(GestorServidor.class.getName()).log(Level.SEVERE, null, ex);
        }
        if (todoOk) {
            enEspera = new EnEsperaD(principal, true, this);
            try {
                enEspera.setVisible(true);
            } catch (Exception e) {
            }
        } else {
            Mensajes.mostrarError("El puerto 5000 esta ocupado. Cierre la aplicacion que lo usa e intente nuevamente.");
        }
    }

    public synchronized void disposeEnEspera() {
        this.enEspera.dispose();
    }

    public void llenarTablaEnEspera() {
        DefaultTableModel dtmTablaEnEspera = (DefaultTableModel) enEspera.getTable().getModel();
        for (int i = 0; i < dtmTablaEnEspera.getRowCount();) {
            dtmTablaEnEspera.removeRow(0);
        }
        Object[] o;
        for (int i = 0; i < jugadores.size(); i++) {
            o = new Object[2];
            o[0] = jugadores.get(i).getNickname();
            o[1] = jugadores.get(i).getPieza();
            dtmTablaEnEspera.addRow(o);
        }
        if (jugadores.size() >= 2) {
            enEspera.getButton().setEnabled(true);
        } else {
            enEspera.getButton().setEnabled(false);
        }
    }

    public LinkedList<Jugador> getJugadores() {
        return jugadores;
    }

    public void eliminarJugador(String nickname) {
        for (int i = 0; i < jugadores.size(); i++) {
            if (jugadores.get(i).getNickname().equals(nickname)) {
                piezas.add(jugadores.get(i).getPieza());
                jugadores.remove(i);
                break;
            }
        }
    }

    public void cerrarServidor() {
        socketServidor.cerrarServidor();
    }

    private void llenarPiezas() {
        piezas.add("Caballo");
        piezas.add("Bota");
        piezas.add("Sombrero");
        piezas.add("Plancha");
    }

    public void comenzarPartida() {
        casilleros = casilleroDao.getCasilleros();
        tarjetasSuerte = tarjetaDao.getTarjetasSuerte();
        tarjetasArcaComunal = tarjetaDao.getTarjetasArca();
        if (casilleros.size() == 0 || tarjetasArcaComunal.size() == 0 || tarjetasSuerte.size() == 0) {
            System.out.println("Error al cargar la base de datos. Por favor intente jugar nuevamente mas tarde.");
            cerrarServidor();
            enEspera.dispose();
            return;
        }
        this.cargarDineroJugadores();
        socketServidor.comenzarPartida();
        enEspera.dispose();
        principalF.setVisible(false);
    }

    public void aniadirResultadoComienzo(int resultado, String nickname) {
        for (int i = 0; i < jugadores.size(); i++) {
            if (jugadores.get(i).getNickname().compareTo(nickname) == 0) {
                jugadores.get(i).setResultadoInicialDados(resultado);
                contJugadoresComienzo++;
            }
        }
        if (contJugadoresComienzo == jugadores.size()) {
            asignarPosicionJugadores();
        }
    }

    private void asignarPosicionJugadores() {
        int mayor = 0;
        int primerJugador = 0;
        for (int i = 0; i < jugadores.size(); i++) {
            if (mayor < jugadores.get(i).getResultadoInicialDados()) {
                mayor = jugadores.get(i).getResultadoInicialDados();
                primerJugador = i;
            }
        }
        int posicionJugador = 2;
        for (int i = 0; i < jugadores.size(); i++) {
            if (i != primerJugador) {
                jugadores.get(i).setPosicionDeJuego(posicionJugador++);
            } else {
                jugadores.get(i).setPosicionDeJuego(1);
            }
        }
        socketServidor.tirarDados(jugadores.get(primerJugador).getNickname());
        setJugadorTurnoActual(1);
    }

    public void setJugadorTurnoActual(int jugadorActual) {
        this.jugadorTurnoActual = jugadorActual;
    }

    public int getJugadorTurnoActual() {
        return jugadorTurnoActual;
    }

    public void informarResultadoDadosJugador(String nickname, int dado1, int dado2) {
        int total = dado1 + dado2;
        String mensajeSiguienteTurno;
        this.mensajeSinParticular = nickname + "-TiroDados-" + total;
        this.mensajeATodos = "";
        this.mensajeEnParticular = "";
        if (estaEnLaCarcel(nickname)) {
            setJugadorProximoTurno();
            if (dado1 == dado2) {
                sacarCarcel(nickname);
                this.mensajeATodos = nickname + "-EnCarcel-false";
                this.mensajeSinParticular = nickname + "-EnCarcel-false;" + this.mensajeSinParticular;
            } else {
                mensajeSiguienteTurno = estaComoMigliore();
                this.mensajeATodos += getSiguienteJugadorTirarDados(getJugadorTurnoActual()) + mensajeSiguienteTurno;
                socketServidor.enviarMensajeSinParticular(this.mensajeSinParticular, nickname, this.mensajeATodos);
                return;
            }
        } else {
            if (dado1 == dado2) {
                this.contadorDado++;
                this.mensajeSinParticular += ";" + nickname + "-Historial-saco dobles, juega de nuevo";
            } else {
                setJugadorProximoTurno();
            }
        }
        if (contadorDado == 3) {
            setJugadorProximoTurno();
            for (Jugador jugador : jugadores) {
                if (jugador.getNickname().compareTo(nickname) == 0) {
                    jugador.setPosicionTablero(10);
                    jugador.setMigliore(true);
                    jugador.setCantTiroCarcel(0);
                }
            }
            this.mensajeATodos = nickname + "-ActualizaTablero-" + 10 + ";" + nickname + "-Historial-fue a la carcel;" + nickname + "-EnCarcel-true;" + getSiguienteJugadorTirarDados(getJugadorTurnoActual()) + estaComoMigliore();
            socketServidor.enviarMensajeSinParticular(this.mensajeSinParticular, nickname, this.mensajeATodos);
            this.resetearVariablesMensajes();
            return;
        }
        int posicionInicial = getPosicionDeJugador(nickname);
        this.moverJugador(nickname, total);
        int posicionFinal = getPosicionDeJugador(nickname);
        if (posicionFinal < posicionInicial && posicionFinal != 0) {
            this.mensajeATodos += this.pasoPorSalida(nickname);
        }
        this.analizarCasillero(posicionFinal, nickname);
        socketServidor.enviarMensajeSinPartConPartATodos(nickname, mensajeEnParticular, mensajeSinParticular, mensajeATodos);
        if (mensajeATodos.contains("gano")) {
            socketServidor.stop();
            socketServidor.close();
        }
        this.resetearVariablesMensajes();
    }

    public void moverJugador(String nickname, int cantPasos) {
        for (Jugador jugador : jugadores) {
            if (jugador.getNickname().compareTo(nickname) == 0) {
                jugador.moverPosicionTablero(cantPasos);
            }
        }
    }

    private int getPosicionDeJugador(String nickname) {
        for (int i = 0; i < jugadores.size(); i++) {
            if (jugadores.get(i).getNickname().compareTo(nickname) == 0) {
                return jugadores.get(i).getPosicionTablero();
            }
        }
        return -1;
    }

    private void analizarCasillero(int posicionDeJugadorQueTiro, String nickname) {
        Casillero casillero = (Casillero) casilleros.getObject(posicionDeJugadorQueTiro);
        switch (casillero.getTipo()) {
            case "Servicio":
                this.analizarCasilleroServicio(casillero, nickname); // FINISHED
                break;
            case "Propiedad":
                this.analizarCasilleroPropiedad(casillero, nickname); // FINISHED
                break;
            case "Ferrocarril":
                this.analizarCasilleroFerrocarril(casillero, nickname); // FINISHED
                break;
            case "Extra":
                this.analizarCasilleroExtra(casillero, nickname); // FINISHED
                break;
        }
    }

    private void analizarCasilleroServicio(Casillero casillero, String nickname) {
        ServicioPublico servi = (ServicioPublico) casillero;
        String nickDuenio = casillero.getDuenio();
        if (nickDuenio.compareTo("") == 0) {
            int posibilidadDePago = calcularSiPuedeComprar(nickname, servi.getPrecio());
            switch (posibilidadDePago) {
                case 1:
                    String mensaje = "Desea comprar " + servi.getNombre() + " al valor de $" + servi.getPrecio() + "?";
                    this.mensajeEnParticular = servi.getIdCasillero() + "-PreguntarComprarTerreno-" + mensaje;
                    break;
                case 2:
                    this.mensajeEnParticular = nickname + "-PreguntarHipotecar-" + servi.getIdCasillero() + "/" + servi.getNombre();
                    break;
                case 3:
                    this.mensajeEnParticular = nickname + "-PreguntarVenderCasas-" + servi.getIdCasillero() + "/" + servi.getNombre();
                    break;
                case 4:
                    this.mensajeEnParticular = nickname + "-PreguntarVenderHipotecar-" + servi.getIdCasillero() + "/" + servi.getNombre();
                    break;
                case -1:
                    this.mensajeEnParticular = nickname + "-NoPuedeAdquirir-" + servi.getIdCasillero() + "/" + servi.getNombre();
                    break;
            }
        } else {
            if (nickDuenio.compareTo(nickname) != 0 && !servi.isEsHipotecado()) {
                this.mensajeEnParticular = nickname + "-TiraDadosXServicio-" + nickDuenio;
            } else {
                if (!this.mensajeATodos.isEmpty()) {
                    this.mensajeATodos += ";" + getSiguienteJugadorTirarDados(getJugadorTurnoActual()) + estaComoMigliore();
                    return;
                }
                this.mensajeATodos = getSiguienteJugadorTirarDados(getJugadorTurnoActual()) + estaComoMigliore();
            }
        }
    }

    private void analizarCasilleroPropiedad(Casillero casillero, String nickname) {
        Propiedad prop = (Propiedad) casillero;
        String nickDuenio = casillero.getDuenio();
        if (nickDuenio.compareTo("") == 0) {
            int posibilidadDePago = calcularSiPuedeComprar(nickname, prop.getPrecio());
            switch (posibilidadDePago) {
                case 1:
                    String mensaje = "Desea comprar " + prop.getNombre() + " al valor de $" + prop.getPrecio() + "?";
                    this.mensajeEnParticular = prop.getIdCasillero() + "-PreguntarComprarTerreno-" + mensaje;
                    break;
                case 2:
                    this.mensajeEnParticular = nickname + "-PreguntarHipotecar-" + prop.getIdCasillero() + "/" + prop.getNombre();
                    break;
                case 3:
                    this.mensajeEnParticular = nickname + "-PreguntarVenderCasas-" + prop.getIdCasillero() + "/" + prop.getNombre();
                    break;
                case 4:
                    this.mensajeEnParticular = nickname + "-PreguntarVenderHipotecar-" + prop.getIdCasillero() + "/" + prop.getNombre();
                    break;
                case -1:
                    this.mensajeEnParticular = nickname + "-NoPuedeAdquirir-" + prop.getIdCasillero() + "/" + prop.getNombre();
                    break;
            }
        } else {
            if (nickDuenio.compareTo(nickname) != 0 && !prop.isEsHipotecado()) {
                int alquiler;
                if (poseeTodasLasPropiedades(prop)) {
                    if (prop.getCantCasas() > 0) {
                        alquiler = prop.getAlquilerConCasa();
                    } else {
                        alquiler = prop.getAlquiler() * 2;
                    }
                } else {
                    alquiler = prop.getAlquiler();
                }
                switch (calcularSiPuedePagar(nickname, alquiler)) {
                    case -1:
                        bancarrota(nickname, nickDuenio);
//                        socketServidor.enviarMensajeSinParticular(mensajeSinJugador, nickname, mensajeBancarrota);
                        break;
                    case 1:
                        pagoAlquilerADuenioEfectivo(nickDuenio, nickname, alquiler);
                        break;
                    case 2:
                        this.mensajeEnParticular = nickname + "-mostrarOpcionesPagoSoloCasas-" + alquiler;
                        this.nickDuenioPagar = nickDuenio;
                        this.alquilerAPagar = alquiler;
                        return;
                    case 3:
                        this.mensajeEnParticular = nickname + "-mostrarOpcionesPagoSoloHipotecas-" + alquiler;
                        this.nickDuenioPagar = nickDuenio;
                        this.alquilerAPagar = alquiler;
                        return;
                    case 4:
                        this.mensajeEnParticular = nickname + "-mostrarOpcionesPagoAmbos-" + alquiler;
                        this.nickDuenioPagar = nickDuenio;
                        this.alquilerAPagar = alquiler;
                        return;
                }
            } else {
                if (!this.mensajeATodos.isEmpty()) {
                    this.mensajeATodos += ";" + getSiguienteJugadorTirarDados(getJugadorTurnoActual()) + estaComoMigliore();
                    return;
                }
                this.mensajeATodos = getSiguienteJugadorTirarDados(getJugadorTurnoActual()) + estaComoMigliore();
            }
        }
    }

    private void analizarCasilleroFerrocarril(Casillero casillero, String nickname) {
        Ferrocarril ferro = (Ferrocarril) casillero;
        String nickDuenio = casillero.getDuenio();
        if (nickDuenio.compareTo("") == 0) {
            int posibilidadDePago = calcularSiPuedeComprar(nickname, ferro.getPrecio());
            switch (posibilidadDePago) {
                case 1:
                    String mensaje = "Desea comprar " + ferro.getNombre() + " al valor de $" + ferro.getPrecio() + "?";
                    this.mensajeEnParticular = ferro.getIdCasillero() + "-PreguntarComprarTerreno-" + mensaje;
                    break;
                case 2:
                    this.mensajeEnParticular = nickname + "-PreguntarHipotecar-" + ferro.getIdCasillero() + "/" + ferro.getNombre();
                    break;
                case 3:
                    this.mensajeEnParticular = nickname + "-PreguntarVenderCasas-" + ferro.getIdCasillero() + "/" + ferro.getNombre();
                    break;
                case 4:
                    this.mensajeEnParticular = nickname + "-PreguntarVenderHipotecar-" + ferro.getIdCasillero() + "/" + ferro.getNombre();
                    break;
                case -1:
                    this.mensajeEnParticular = nickname + "-NoPuedeAdquirir-" + ferro.getIdCasillero() + "/" + ferro.getNombre();
                    break;
            }
        } else {
            if (nickDuenio.compareTo(nickname) != 0 && !ferro.isEsHipotecado()) {
                int alquiler;
                int cantFerro = cantidadDeFerrocarrilles(nickDuenio);
                alquiler = ferro.getAlquiler() * (int) Math.pow(2, cantFerro - 1);
                if (this.esDoble) {
                    alquiler = alquiler * 2;
                }
                this.esDoble = false;
                switch (calcularSiPuedePagar(nickname, alquiler)) {
                    case -1:
                        bancarrota(nickname, nickDuenio);
//                        socketServidor.enviarMensajeSinParticular(mensajeSinJugador, nickname, mensajeBancarrota);
                        break;
                    case 1:
                        pagoAlquilerADuenioEfectivo(nickDuenio, nickname, alquiler);
                        break;
                    case 2:
                        this.mensajeEnParticular = nickname + "-mostrarOpcionesPagoSoloCasas-" + alquiler;
                        this.nickDuenioPagar = nickDuenio;
                        this.alquilerAPagar = alquiler;
                        return;
                    case 3:
                        this.mensajeEnParticular = nickname + "-mostrarOpcionesPagoSoloHipotecas-" + alquiler;
                        this.nickDuenioPagar = nickDuenio;
                        this.alquilerAPagar = alquiler;
                        return;
                    case 4:
                        this.mensajeEnParticular = nickname + "-mostrarOpcionesPagoAmbos-" + alquiler;
                        this.nickDuenioPagar = nickDuenio;
                        this.alquilerAPagar = alquiler;
                        return;
                }
            } else {
                this.esDoble = false;
                if (!this.mensajeATodos.isEmpty()) {
                    this.mensajeATodos += ";" + getSiguienteJugadorTirarDados(getJugadorTurnoActual()) + estaComoMigliore();
                    return;
                }
                this.mensajeATodos = getSiguienteJugadorTirarDados(getJugadorTurnoActual()) + estaComoMigliore();
            }
        }
    }

    private void analizarCasilleroExtra(Casillero casillero, String nickname) {
        String mensaje = "";
        String mensajeSiguienteTurno;
        switch (casillero.getNombre()) {
            case "Suerte":
                tomarTarjetaSuerte(nickname);
                break;
            case "Arca Comunal":
                tomarTarjetaArcaComunal(nickname);
                break;
            case "Libre Estacionamiento":
                mensajeSiguienteTurno = estaComoMigliore();
                mensaje = getSiguienteJugadorTirarDados(getJugadorTurnoActual()) + mensajeSiguienteTurno;
                if (this.mensajeATodos.compareTo("") != 0) {
                    this.mensajeATodos += ";" + mensaje;
                    return;
                }
                this.mensajeATodos = mensaje + ";" + nickname + "-Historial-avanzó a libre estacionamiento.";
                break;
            case "Carcel":
                mensajeSiguienteTurno = estaComoMigliore();
                mensaje = getSiguienteJugadorTirarDados(getJugadorTurnoActual()) + mensajeSiguienteTurno;
                if (this.mensajeATodos.compareTo("") != 0) {
                    this.mensajeATodos += ";" + mensaje;
                    return;
                }
                this.mensajeATodos = mensaje + ";" + nickname + "-Historial-está de visitas.";
                break;
            case "Vaya A La Carcel":
                for (Jugador jugador : jugadores) {
                    if (jugador.getNickname().compareTo(nickname) == 0) {
                        jugador.setPosicionTablero(10);
                        jugador.setMigliore(true);
                        jugador.setCantTiroCarcel(0);
                    }
                }
                mensaje = nickname + "-ActualizaTablero-" + 10 + ";" + nickname + "-Historial-fue a la carcel;" + nickname + "-EnCarcel-true;" + getSiguienteJugadorTirarDados(getJugadorTurnoActual()) + estaComoMigliore();
                if (this.mensajeATodos.compareTo("") != 0) {
                    this.mensajeATodos += ";" + mensaje;
                    return;
                }
                this.mensajeATodos = mensaje;
                break;
            case "Impuesto Sobre Ingreso":
                cobrarImpuesto(200, nickname);
                break;
            case "Impuesto Sobre Poseseiones De Lujo":
                cobrarImpuesto(75, nickname);
                break;
            case "Salida":
                for (Jugador jugador : jugadores) {
                    if (jugador.getNickname().compareTo(nickname) == 0) {
                        mensaje = pasoPorSalida(nickname) + ";";
                    }
                }
                mensajeSiguienteTurno = estaComoMigliore();
                mensaje += getSiguienteJugadorTirarDados(getJugadorTurnoActual()) + mensajeSiguienteTurno;
                if (this.mensajeATodos.compareTo("") != 0) {
                    this.mensajeATodos += ";" + mensaje;
                    return;
                }
                this.mensajeATodos = mensaje;
                break;
        }
    }

    private void cargarDineroJugadores() {
        for (Jugador jugador : jugadores) {
            jugador.setDinero(1500);
        }
    }

    @SuppressWarnings("empty-statement")
    private void aumentarDineroJugador(int dinero, String nickname) {
        int i;
        for (i = 0; jugadores.get(i).getNickname().compareTo(nickname) != 0; i++);
        jugadores.get(i).aumentarDinero(dinero);
    }

    @SuppressWarnings("empty-statement")
    private int disminuirDineroJugador(int dinero, String nickname) {
        int i;
        for (i = 0; jugadores.get(i).getNickname().compareTo(nickname) != 0; i++);
        jugadores.get(i).disminuirDinero(dinero);
        return jugadores.get(i).getDinero();
    }

    private void cobrarImpuesto(int cantACobrar, String nickname) {
        int dinero = 0;
        String mensajeSiguienteTurno;
        switch (calcularSiPuedePagar(nickname, cantACobrar)) {
            case -1:
                bancarrota(nickname, "Banco");
                return;
            case 2:
                this.mensajeEnParticular = nickname + "-mostrarOpcionesPagoSoloCasas-" + alquilerAPagar;
                this.nickDuenioPagar = "banco";
                this.alquilerAPagar = cantACobrar;
                return;
            case 3:
                this.mensajeEnParticular = nickname + "-mostrarOpcionesPagoSoloHipotecas-" + alquilerAPagar;
                this.nickDuenioPagar = "banco";
                this.alquilerAPagar = cantACobrar;
                return;
            case 4:
                this.mensajeEnParticular = nickname + "-mostrarOpcionesPagoAmbos-" + alquilerAPagar;
                this.nickDuenioPagar = "banco";
                this.alquilerAPagar = cantACobrar;
                return;
        }
        for (Jugador jugador : jugadores) {
            if (jugador.getNickname().compareTo(nickname) == 0) {
                jugador.disminuirDinero(cantACobrar);
                dinero = jugador.getDinero();
            }
        }
        mensajeSiguienteTurno = estaComoMigliore();
        String mensaje = nickname + "-Historial-pagó $" + cantACobrar + " por impuesto;" + nickname + "-ActualizaDinero-" + dinero + ";" + getSiguienteJugadorTirarDados(getJugadorTurnoActual()) + mensajeSiguienteTurno;
        if (this.mensajeATodos.compareTo("") != 0) {
            this.mensajeATodos += ";" + mensaje;
            return;
        }
        this.mensajeATodos = mensaje;
    }

    private void tomarTarjetaSuerte(String nickname) {
        Tarjeta tarjeta = (Tarjeta) tarjetasSuerte.getObject(contadorSuerte);
        if (tarjeta.getAccion().compareTo("-salgaCarcel-") == 0) {
            this.keyTarjetaSuerte = contadorSuerte;
        }
        contadorSuerte++;
        if (tarjeta.isConDuenio()) {
            tarjeta = (Tarjeta) tarjetasSuerte.getObject(contadorSuerte);
            if (tarjeta.getAccion().compareTo("-salgaCarcel-") == 0) {
                this.keyTarjetaSuerte = contadorSuerte;
            }
            contadorSuerte++;
        }
        if (contadorSuerte > 16) {
            contadorSuerte = 1;
        }
        String mensajeGeneralHistorial = nickname + "-Historial-" + tarjeta.getDescripcion();
        if (this.mensajeATodos.compareTo("") != 0) {
            this.mensajeATodos += ";";
        }
        this.mensajeATodos += mensajeGeneralHistorial;
        procesarTarjetaSuerteYArca(nickname, tarjeta);
    }

    private void tomarTarjetaArcaComunal(String nickname) {
        Tarjeta tarjeta = (Tarjeta) tarjetasArcaComunal.getObject(contadorArca);
        if (tarjeta.getAccion().compareTo("-salgaCarcelA-") == 0) {
            this.keyTarjetaArca = contadorArca;
        }
        contadorArca++;
        if (tarjeta.isConDuenio()) {
            tarjeta = (Tarjeta) tarjetasArcaComunal.getObject(contadorArca);
            if (tarjeta.getAccion().compareTo("-salgaCarcelA-") == 0) {
                this.keyTarjetaArca = contadorArca;
            }
            contadorArca++;
        }
        if (contadorArca > 16) {
            contadorArca = 1;
        }
        String mensajeGeneralHistorial = nickname + "-Historial-" + tarjeta.getDescripcion();
        if (mensajeATodos.compareTo("") != 0) {
            this.mensajeATodos += ";";
        }
        this.mensajeATodos += mensajeGeneralHistorial;
        procesarTarjetaSuerteYArca(nickname, tarjeta);
    }

    public boolean existeJugador(String nickname) {
        for (Jugador jugador : jugadores) {
            if (jugador.getNickname().compareTo(nickname) == 0) {
                return true;
            }
        }
        return false;
    }

    public int getCantidadJugadores() {
        return jugadores.size();
    }

    public void setPrincipalVisible(boolean estado) {
        this.principalF.setVisible(estado);
    }

    public void jugadorCompra(String nickname, String idTerreno) {
        int casilleroTerreno = Integer.parseInt(idTerreno);
        int dinero = 0;
        String mensajeSiguienteTurno;
        Casillero casillero = (Casillero) casilleros.getObject(casilleroTerreno);
        casillero.setDuenio(nickname);
        for (Jugador jugador : jugadores) {
            if (jugador.getNickname().compareTo(nickname) == 0) {
                jugador.agregarPropiedad(casilleroTerreno);
                jugador.disminuirDinero(traerPrecioCasillero(casillero));
                dinero = jugador.getDinero();
            }
        }
        mensajeSiguienteTurno = estaComoMigliore();
        String mensajeCompra = nickname + "-Compro-" + casillero.getNombre();
        mensajeCompra += ";" + nickname + "-ActualizaDinero-" + dinero + ";" + getSiguienteJugadorTirarDados(getJugadorTurnoActual()) + mensajeSiguienteTurno;
        socketServidor.enviarMensaje(mensajeCompra);
    }

    public void jugadorCompraSubasta(String nickname, String idTerreno, String mensajeDeSubasta, int pago) {
        int casilleroTerreno = Integer.parseInt(idTerreno);
        int dinero;
        String mensajeSiguienteTurno;
        dinero = Integer.parseInt(this.getDineroJugador(nickname));
        if (pago > dinero) {
            String men = nickname + "-HipotecaSub-";
            socketServidor.enviarMensajeEnParticular(nickname, men);
            return;
        }
        Casillero casillero = (Casillero) casilleros.getObject(casilleroTerreno);
        casillero.setDuenio(nickname);
        for (Jugador jugador : jugadores) {
            if (jugador.getNickname().compareTo(nickname) == 0) {
                jugador.agregarPropiedad(casilleroTerreno);
                jugador.disminuirDinero(pago);
                dinero = jugador.getDinero();
            }
        }
        mensajeSiguienteTurno = estaComoMigliore();
        String mensajeCompra = mensajeDeSubasta + ";" + nickname + "-ComproEnSubasta-" + casillero.getNombre() + "-" + pago;
        mensajeCompra += ";" + nickname + "-ActualizaDinero-" + dinero;
        reiniciarVariablesSubasta();
        if (subastaPorBancarrota) {
            if (propiedadesASubastarPorBancarrota.size() != 0) {
                int idTerr = propiedadesASubastarPorBancarrota.pop();
                casillero = (Casillero) casilleros.getObject(idTerr);
                String jugadorSiguienteAOfertar = getJugadorSiguienteOfertar(nickname);
                String jugadorAMostrarEnOferta = jugadorSiguienteAOfertar;
                String precio = traerPrecioCasillero(casillero) + "";
                String mensajeSubasta = idTerr + "-Subasta-" + casillero.getNombre() + "-" + jugadorSiguienteAOfertar + "-" + jugadorAMostrarEnOferta + "-" + precio;
                mensajeCompra += ";" + mensajeSubasta;
            } else {
                subastaPorBancarrota = false;
                mensajeCompra += ";" + getSiguienteJugadorTirarDados(getJugadorTurnoActual()) + mensajeSiguienteTurno;
            }
        } else {
            mensajeCompra += ";" + getSiguienteJugadorTirarDados(getJugadorTurnoActual()) + mensajeSiguienteTurno;
        }
        socketServidor.enviarMensaje(mensajeCompra);
    }

    public int traerPrecioCasillero(Casillero casillero) {
        int precio = 0;
        switch (casillero.getTipo()) {
            case "Servicio":
                precio = ((ServicioPublico) casillero).getPrecio();
                break;
            case "Propiedad":
                precio = ((Propiedad) casillero).getPrecio();
                break;
            case "Ferrocarril":
                precio = ((Ferrocarril) casillero).getPrecio();
                break;
        }
        return precio;
    }

    public void comenzarSubasta(String nickname, String idTerreno) {
        this.idTerrenoEnSubasta = idTerreno;
        int nroCasillero = Integer.parseInt(idTerreno);
        Casillero casillero = (Casillero) casilleros.getObject(nroCasillero);
        String jugadorSiguienteAOfertar = getJugadorSiguienteOfertar(nickname);
        String jugadorAMostrarEnOferta = jugadorSiguienteAOfertar;
        String precio = traerPrecioCasillero(casillero) + "";
        socketServidor.enviarMensajeSubasta(casillero.getNombre(), idTerreno, jugadorSiguienteAOfertar, jugadorAMostrarEnOferta, precio);
    }

    private String getJugadorSiguienteOfertar(String nickname) {
        int posicionDelActual = 0;
        String nicknameSiguiente = "";
        for (int i = 0; i < jugadores.size(); i++) {
            if (jugadores.get(i).getNickname().compareTo(nickname) == 0) {
                posicionDelActual = jugadores.get(i).getPosicionDeJuego();
            }
        }
        for (int i = 0; i < jugadores.size(); i++) {
            if (posicionDelActual == jugadores.size()) {
                if (jugadores.get(i).getPosicionDeJuego() == 1) {
                    if (!jugadores.get(i).isEnSubasta() || jugadores.get(i).isBancarrota()) {
                        nicknameSiguiente = getJugadorSiguienteOfertar(jugadores.get(i).getNickname());
                    } else {
                        nicknameSiguiente = jugadores.get(i).getNickname();
                    }
                }
            } else {
                if (jugadores.get(i).getPosicionDeJuego() == posicionDelActual + 1) {
                    if (!jugadores.get(i).isEnSubasta() || jugadores.get(i).isBancarrota()) {
                        nicknameSiguiente = getJugadorSiguienteOfertar(jugadores.get(i).getNickname());
                    } else {
                        nicknameSiguiente = jugadores.get(i).getNickname();
                    }
                }
            }
        }
        return nicknameSiguiente;
    }

    public void procesarOferta(String nickname, String oferta) {
        if (oferta.contains("salio")) {
            for (int i = 0; i < jugadores.size(); i++) {
                if (jugadores.get(i).getNickname().compareTo(nickname) == 0) {
                    jugadores.get(i).setEnSubasta(false);
                }
            }
        } else if (oferta.contains("si")) {
            String mensajeSubasta = nickname + "-GanoSubasta-";
            jugadorCompraSubasta(nickname, idTerrenoEnSubasta, mensajeSubasta, 1);
            return;
        } else if (oferta.contains("no")) {
            String mensajeSubasta = "nadie" + "-GanoSubasta-";
            if (subastaPorBancarrota) {
                Casillero cas = (Casillero) casilleros.getObject(Integer.parseInt(idTerrenoEnSubasta));
                cas.setDuenio("");
                if (propiedadesASubastarPorBancarrota.size() != 0) {
                    int idTerr = propiedadesASubastarPorBancarrota.pop();
                    idTerrenoEnSubasta = idTerr + "";
                    Casillero casillero = (Casillero) casilleros.getObject(idTerr);
                    String jugadorSiguienteAOfertar = getJugadorSiguienteOfertar(nickname);
                    String jugadorAMostrarEnOferta = jugadorSiguienteAOfertar;
                    String precio = traerPrecioCasillero(casillero) + "";
                    String subastaPropiedadSiguiente = idTerr + "-Subasta-" + casillero.getNombre() + "-" + jugadorSiguienteAOfertar + "-" + jugadorAMostrarEnOferta + "-" + precio;
                    mensajeSubasta += ";" + subastaPropiedadSiguiente;
                } else {
                    subastaPorBancarrota = false;
                    mensajeSubasta += ";" + getSiguienteJugadorTirarDados(getJugadorTurnoActual()) + "-TiraLosDados-";
                }
            } else {
                mensajeSubasta += ";" + getSiguienteJugadorTirarDados(getJugadorTurnoActual()) + "-TiraLosDados-";
            }
            reiniciarVariablesSubasta();
            socketServidor.enviarMensaje(mensajeSubasta);
            return;
        } else {
            asignarUltimaOferta(nickname, oferta);
        }
        String nickGanador = terminoSubasta();
        if (!nickGanador.isEmpty()) {
            if (nickGanador.endsWith("preguntarComprarA1")) {
                nickGanador = nickGanador.substring(0, nickGanador.indexOf("/"));
                socketServidor.enviarMensajeEnParticular(nickGanador, "-SubastaOferta-preguntarSiNo");
                return;
            } else {
                String mensajeSubasta = nickGanador + "-GanoSubasta-";
                jugadorCompraSubasta(nickGanador, idTerrenoEnSubasta, mensajeSubasta, obtenerUltimaOfertaJugador(nickGanador));
                return;
            }
        }
        String siguienteJugadorAOfertar = this.getJugadorSiguienteOfertar(nickname);
        String siguienteJugadorAMostrar = siguienteJugadorAOfertar;
        String mensaje = nickname + "-SubastaOferta-" + oferta + "-" + siguienteJugadorAOfertar + "-" + siguienteJugadorAMostrar;
        socketServidor.enviarMensaje(mensaje);
    }

    private void setJugadorProximoTurno() {
        if (this.getJugadorTurnoActual() == jugadores.size()) {
            jugadorTurnoActual = 1;
        } else {
            jugadorTurnoActual++;
        }
        contadorDado = 0;
    }

    private String getSiguienteJugadorTirarDados(int jugadorTurnoActual) {
        String jugadorSiguiente = "";
        for (int i = 0; i < jugadores.size(); i++) {
            if (jugadores.get(i).getPosicionDeJuego() == jugadorTurnoActual) {
                if (jugadores.get(i).isBancarrota()) {
                    setJugadorProximoTurno();
                    return getSiguienteJugadorTirarDados(getJugadorTurnoActual());
                }
                jugadorSiguiente = jugadores.get(i).getNickname();
            }
        }
        return jugadorSiguiente;
    }

    public synchronized void notificar() {
        notifyAll();
    }

    public void setTodoOk(boolean estado) {
        this.todoOk = estado;
    }

    public boolean getTodoOk() {
        return todoOk;
    }

    private boolean poseeTodasLasPropiedades(Propiedad prop) {
        String duenio = prop.getDuenio();
        LinkedList<Integer> propHnas = prop.getHnos();
        for (Integer integer : propHnas) {
            if (((Casillero) casilleros.getObject(integer)).getDuenio().compareTo(duenio) != 0) {
                return false;
            }
        }
        return true;
    }

    private int calcularSiPuedePagar(String nickname, int alquiler) {//-1 bancarrota, 1 con efectivo, 2 Si es casa + efectivo, 3 si es hipoteca + efectivo, 4 si es hipoteca + casa + efectivo
        Jugador jug;
        boolean puedePagarConCasas = false;
        boolean puedePagarConHipotecas = false;
        int sumaValoresHipoteca;
        int sumaValoresVendiendoCasas;
        //2 Si es casa + efectivo, 3 si es hipoteca + efectivo, 4 si es hipoteca + casa + efectivo
        int i;
        for (i = 0; jugadores.get(i).getNickname().compareTo(nickname) != 0; i++);
        jug = jugadores.get(i);
        if (jug.getDinero() >= alquiler) {
            return 1; //SI PUEDE PAGAR CON EFECTIVO
        } else {
            LinkedList<Integer> propiedades = jug.getPropiedades();
            if (propiedades.size() == 0) {
                return -1; //BANCARROTA
            } else {
                sumaValoresVendiendoCasas = jug.getDinero();
                for (Integer integer : propiedades) {
                    Propiedad prop;
                    Casillero cas = (Casillero) casilleros.getObject(integer);
                    if (cas.getTipo().equals("Propiedad")) {
                        Propiedad p = (Propiedad) cas;
                        if (p.getCantCasas() != 0) {
                            sumaValoresVendiendoCasas += p.getCantCasas() * (p.getValorCasa() / 2);
                            if (sumaValoresVendiendoCasas > alquiler) {
                                puedePagarConCasas = true; //PUEDE PAGAR VENDIENDO CASAS+EFECTIVO
                            }
                        }
                    }
                }
                sumaValoresHipoteca = jug.getDinero();
                for (Integer integer : propiedades) {
                    Propiedad prop;
                    Ferrocarril ferro;
                    ServicioPublico servicio;
                    Casillero cas = (Casillero) casilleros.getObject(integer);
                    switch (cas.getTipo()) {
                        case "Propiedad":
                            //corregir y validar que la propiedad no tenga casa
                            prop = (Propiedad) cas;
                            if (prop.getCantCasas() == 0 && !prop.isEsHipotecado() && !tieneConstrucciones(prop)) {
                                sumaValoresHipoteca += prop.getValorHipotecario();
                                if (sumaValoresHipoteca > alquiler) {
                                    puedePagarConHipotecas = true; //PAGAR HIPOTECANDO
                                }
                            }
                            break;
                        case "Ferrocarril":
                            ferro = (Ferrocarril) cas;
                            if (!ferro.isEsHipotecado()) {
                                sumaValoresHipoteca += ferro.getValorHipotecario();
                            }
                            if (sumaValoresHipoteca > alquiler) {
                                puedePagarConHipotecas = true; //PAGAR HIPOTECANDO
                            }
                            break;
                        case "Servicio":
                            servicio = (ServicioPublico) cas;
                            if (!servicio.isEsHipotecado()) {
                                sumaValoresHipoteca += servicio.getValorHipotecario();
                            }
                            if (sumaValoresHipoteca > alquiler) {
                                puedePagarConHipotecas = true; //PAGAR HIPOTECANDO
                            }
                            break;
                    }
                }
            }
        }
        if (puedePagarConCasas && puedePagarConHipotecas) {
            return 4;
        } else if (puedePagarConCasas) {
            return 2;
        } else if (puedePagarConHipotecas) {
            return 3;
        } else {
            if ((sumaValoresHipoteca + sumaValoresVendiendoCasas - jug.getDinero()) > alquiler) {
                return 4;
            } else {
                return -1;
            }
        }
    }

    private void pagoAlquilerADuenioEfectivo(String nickDuenio, String nickname, int alquiler) {
        int dineroDuenio = 0, dineroInquilino = 0;
        for (Jugador jugador : jugadores) {
            if (jugador.getNickname().compareTo(nickDuenio) == 0) {
                jugador.aumentarDinero(alquiler);
                dineroDuenio = jugador.getDinero();
            }
            if (jugador.getNickname().compareTo(nickname) == 0) {
                jugador.disminuirDinero(alquiler);
                dineroInquilino = jugador.getDinero();
            }
        }
        String historial = nickname + "-Historial-le pago a " + nickDuenio + " $" + alquiler + " por alquiler";
        String mensaje = historial + ";" + nickname + "-ActualizaDinero-" + dineroInquilino + ";" + nickDuenio + "-ActualizaDinero-" + dineroDuenio;
        mensaje += ";" + getSiguienteJugadorTirarDados(getJugadorTurnoActual()) + estaComoMigliore(); // TODO
        if (this.mensajeATodos.compareTo("") != 0) {
            this.mensajeATodos += ";" + mensaje;
            return;
        }
        this.mensajeATodos = mensaje;
    }

    private int cantidadDeFerrocarrilles(String nickDuenio) {
        int cant = 0;
        for (int i = 5; i < 36; i += 10) {
            Casillero cas = (Casillero) casilleros.getObject(i);
            if (cas.getDuenio().compareTo(nickDuenio) == 0) {
                cant++;
            }
        }
        return cant;
    }

    private int cantidadDeServicios(String nickDuenio) {
        int cant = 0;
        Casillero cas = (Casillero) casilleros.getObject(12);
        if (cas.getDuenio().compareTo(nickDuenio) == 0) {
            cant++;
        }
        cas = (Casillero) casilleros.getObject(28);
        if (cas.getDuenio().compareTo(nickDuenio) == 0) {
            cant++;
        }
        return cant;
    }

    public void cobroAlquilerServicio(int dado1, int dado2, String nickDuenioServicio, String nickname) {
        int alquiler = 0;
        int total = dado1 + dado2;
        int cantServicios = cantidadDeServicios(nickDuenioServicio);
        if (this.esDoble) {
            cantServicios = 2;
        }
        this.esDoble = false;
        switch (cantServicios) {
            case 1:
                alquiler = 4 * total;
                break;
            case 2:
                alquiler = 10 * total;
                break;
        }
        switch (calcularSiPuedePagar(nickname, alquiler)) {
            case -1:
                bancarrota(nickname, nickDuenioServicio);
                break;
            case 1:
                pagoAlquilerADuenioEfectivo(nickDuenioServicio, nickname, alquiler);
                break;
            case 2:
                this.mensajeEnParticular = nickname + "-mostrarOpcionesPagoSoloCasas-" + alquiler;
                this.nickDuenioPagar = nickDuenioServicio;
                this.alquilerAPagar = alquiler;
                break;
            case 3:
                this.mensajeEnParticular = nickname + "-mostrarOpcionesPagoSoloHipotecas-" + alquiler;
                this.nickDuenioPagar = nickDuenioServicio;
                this.alquilerAPagar = alquiler;
                break;
            case 4:
                this.mensajeEnParticular = nickname + "-mostrarOpcionesPagoAmbos-" + alquiler;
                this.nickDuenioPagar = nickDuenioServicio;
                this.alquilerAPagar = alquiler;
                break;
        }
        socketServidor.enviarMensajeSinPartConPartATodos(nickname, mensajeEnParticular, mensajeSinParticular, mensajeATodos);
        this.resetearVariablesMensajes();
    }

    public void bancarrota(String nickBancarrota, String nickDuenio) {
        int c = 0;
        for (Jugador jugador : jugadores) {
            if (jugador.getNickname().compareTo(nickBancarrota) == 0) {
                jugador.setBancarrota(true);
                jugador.setEnSubasta(false);
            }
            if (!jugador.isBancarrota()) {
                c++;
            }
        }
        if (c == 1) {
            if (nickDuenio.compareTo("Banco") == 0) {
                for (int i = 0; i < jugadores.size(); i++) {
                    if (!jugadores.get(i).isBancarrota()) {
                        this.mensajeATodos = jugadores.get(i).getNickname() + "-gano-";
                        return;
                    }
                }
            }
            this.mensajeATodos = nickDuenio + "-gano-";
            return;
        }
        if (!this.mensajeATodos.isEmpty()) {
            this.mensajeATodos += ";";
        }
        this.mensajeATodos += nickBancarrota + "-Bancarrota-;";

        propiedadesASubastarPorBancarrota = getJugador(nickBancarrota).getPropiedades();
        if (!propiedadesASubastarPorBancarrota.isEmpty()) {
            //Limpiar casas de las propiedades del jugador en bancarrota
            String mensajeActualizarCasas = "-ActualizarCostrucciones";
            for (Integer propiedad : propiedadesASubastarPorBancarrota) {
                Casillero cas = (Casillero) casilleros.getObject(propiedad);
                if (cas.getTipo().compareTo("Propiedad") == 0) {
                    Propiedad p = (Propiedad) cas;
                    p.setCantCasas(0);
                    //if (mensajeActualizarCasas.endsWith("-")) {
                    mensajeActualizarCasas += "-" + p.getIdCasillero() + "/" + p.getCantCasas();
                    //} else {
                    //   mensajeActualizarCasas += p.getIdCasillero() + "/" + p.getCantCasas() + "-";
                    //}
                }
            }

            this.mensajeATodos += mensajeActualizarCasas;
        }
        if (nickDuenio.compareTo("Banco") == 0) {
            //Poner en subasta las propiedades de nickDuenio
            //limpiar 

            int idTerr = propiedadesASubastarPorBancarrota.pop();
            Casillero casillero = (Casillero) casilleros.getObject(idTerr);
            String jugadorSiguienteAOfertar = getJugadorSiguienteOfertar(nickBancarrota);
            String jugadorAMostrarEnOferta = jugadorSiguienteAOfertar;
            String precio = traerPrecioCasillero(casillero) + "";
            String mensajeSubasta = idTerr + "-Subasta-" + casillero.getNombre() + "-" + jugadorSiguienteAOfertar + "-" + jugadorAMostrarEnOferta + "-" + precio;
            this.mensajeATodos += ";" + mensajeSubasta;
            idTerrenoEnSubasta = idTerr + "";
            subastaPorBancarrota = true;
            return;
        }
        String mensaje = "";
        int dinero = Integer.parseInt(this.getDineroJugador(nickBancarrota));
        dinero += this.venderCasasPorBancarrota(nickBancarrota);
        mensaje += this.traspasoTarjetas(nickDuenio, nickBancarrota);
        if (!mensaje.isEmpty()) {
            mensaje += ";";
        }
        mensaje += this.traspasoPropiedades(nickDuenio, new LinkedList<Integer>(Arrays.asList(-1)), nickBancarrota);
        if (!mensaje.endsWith(";")) {
            mensaje += ";";
        }
//        String hipotecadas = this.hipotecadasJugador(nickDuenio, nickBancarrota);
//        if (!hipotecadas.isEmpty()) {
//            mensaje += hipotecadas + ";";
//            dinero -= this.impuestoHipotecadas(nickBancarrota);
//        }
        dinero += Integer.parseInt(this.getDineroJugador(nickDuenio));
        this.getJugador(nickDuenio).setDinero(dinero);
        mensaje += nickDuenio + "-ActualizaDinero-" + dinero + ";" + nickBancarrota + "-Bancarrota-";
        if (!this.mensajeATodos.isEmpty()) {
            this.mensajeATodos += ";";
        }
        this.mensajeATodos += ";" + mensaje;

        propiedadesASubastarPorBancarrota = getJugador(nickBancarrota).getPropiedades();

        this.mensajeATodos += ";" + getSiguienteJugadorTirarDados(getJugadorTurnoActual()) + estaComoMigliore();
    }

    public String traspasoPropiedades(String nuevoDuenio, LinkedList<Integer> propiedades, String duenioAnterior) {
        String props = nuevoDuenio + "-AdquirioPropiedadesPorBancarrota-";
        String historial = nuevoDuenio + "-Historial-El jugador " + nuevoDuenio + " adquirió las siguientes propiedades: ";
        if (propiedades.getFirst() == -1) {
            propiedades = this.getJugador(duenioAnterior).getPropiedades();
            this.getJugador(duenioAnterior).setPropiedades(new LinkedList<Integer>());
        }
        for (Integer integer : propiedades) {
            Casillero cas = (Casillero) casilleros.getObject(integer);
            cas.setDuenio(nuevoDuenio);
            this.getJugador(nuevoDuenio).agregarPropiedad(integer);
            props += cas.getNombre() + "/";
            historial += cas.getNombre() + " ";
        }
        if (props.endsWith("rrota-")) {
            props += "noTiene";
        }
        if (!historial.endsWith("s: ")) {
            props += ";" + historial;
        }
        return props;
    }

    private void procesarTarjetaSuerteYArca(String nickname, Tarjeta tarjeta) {
        String accion = tarjeta.getAccion();
        this.mensajeEnParticular = nickname + "-MostrarTarjeta-" + tarjeta.getNombreArchivo();
        procesarAccion(accion, nickname);
    }

    private int cantidadDeCasas(String nickname) {
        int i, cantCasas = 0;
        for (i = 0; jugadores.get(i).getNickname().compareTo(nickname) != 0; i++);
        Jugador jug = jugadores.get(i);
        LinkedList<Integer> props = jug.getPropiedades();
        for (Integer integer : props) {
            Casillero cas = (Casillero) casilleros.getObject(integer);
            if (cas.getTipo().compareTo("Propiedad") == 0) {
                Propiedad prop = (Propiedad) cas;
                int cant = prop.getCantCasas();
                if (cant < 5) {
                    cantCasas += cant;
                }
            }
        }
        return cantCasas;
    }

    private int cantidadDeHoteles(String nickname) {
        int i, cantHoteles = 0;
        for (i = 0; jugadores.get(i).getNickname().compareTo(nickname) != 0; i++);
        Jugador jug = jugadores.get(i);
        LinkedList<Integer> props = jug.getPropiedades();
        for (Integer integer : props) {
            Casillero cas = (Casillero) casilleros.getObject(integer);
            if (cas.getTipo().compareTo("Propiedad") == 0) {
                Propiedad prop = (Propiedad) cas;
                int cant = prop.getCantCasas();
                if (cant == 5) {
                    cantHoteles++;
                }
            }
        }
        return cantHoteles;
    }

    private void procesarAccion(String accion, String nickname) {
        String mensaje = "";
        String mensajeSiguienteTurno = estaComoMigliore();
        int dinero = 0, posicion = 0;
        switch (accion) {
            case "-cobra50banco-":
                for (Jugador jugador : jugadores) {
                    if (jugador.getNickname().compareTo(nickname) == 0) {
                        jugador.aumentarDinero(50);
                        dinero = jugador.getDinero();
                    }
                }
                mensaje = nickname + "-ActualizaDinero-" + dinero + ";" + getSiguienteJugadorTirarDados(getJugadorTurnoActual()) + mensajeSiguienteTurno;
                if (!this.mensajeATodos.isEmpty()) {
                    this.mensajeATodos += ";";
                }
                this.mensajeATodos += mensaje;
                break;
            case "-vayaCarcel-":
                for (Jugador jugador : jugadores) {
                    if (jugador.getNickname().compareTo(nickname) == 0) {
                        jugador.setPosicionTablero(10);
                        jugador.setMigliore(true);
                        jugador.setCantTiroCarcel(0);
                    }
                }
                mensaje = nickname + "-ActualizaTablero-" + 10 + ";" + nickname + "-EnCarcel-true;" + getSiguienteJugadorTirarDados(getJugadorTurnoActual()) + estaComoMigliore();
                if (!this.mensajeATodos.isEmpty()) {
                    this.mensajeATodos += ";";
                }
                this.mensajeATodos += mensaje;
                break;
            case "-aCasillero39-":
                for (Jugador jugador : jugadores) {
                    if (jugador.getNickname().compareTo(nickname) == 0) {
                        jugador.setPosicionTablero(39);
                    }
                }
                mensaje = nickname + "-ActualizaTablero-" + 39;
                if (!this.mensajeATodos.isEmpty()) {
                    this.mensajeATodos += ";";
                }
                this.mensajeATodos += mensaje;
                break;
            case "-aSalida-":
                for (Jugador jugador : jugadores) {
                    if (jugador.getNickname().compareTo(nickname) == 0) {
                        jugador.setPosicionTablero(0);
                    }
                }
                mensaje = nickname + "-ActualizaTablero-" + 0;
                if (!this.mensajeATodos.isEmpty()) {
                    this.mensajeATodos += ";";
                }
                this.mensajeATodos += mensaje;
                break;
            case "-aFerroMasCerca-":
                posicion = 0;
                for (Jugador jugador : jugadores) {
                    if (jugador.getNickname().compareTo(nickname) == 0) {
                        posicion = jugador.moverAFerrocarrilCercano();
                    }
                }
                this.esDoble = this.tieneDuenio(posicion);
                mensaje = nickname + "-ActualizaTablero-" + posicion;
                if (!this.mensajeATodos.isEmpty()) {
                    this.mensajeATodos += ";";
                }
                this.mensajeATodos += mensaje;
                break;
            case "-atras3espacios-":
                for (Jugador jugador : jugadores) {
                    if (jugador.getNickname().compareTo(nickname) == 0) {
                        posicion = jugador.getPosicionTablero() - 3;
                        jugador.setPosicionTablero(posicion);
                    }
                }
                mensaje = nickname + "-ActualizaTablero-" + posicion;
                if (!this.mensajeATodos.isEmpty()) {
                    this.mensajeATodos += ";";
                }
                this.mensajeATodos += mensaje;
                break;
            case "-salgaCarcel-":
                for (Jugador jugador : jugadores) {
                    if (jugador.getNickname().compareTo(nickname) == 0) {
                        jugador.setSalgaCarcelSuerte(true);
                    }
                }
                Tarjeta tarjetaSuerte = (Tarjeta) tarjetasSuerte.getObject(keyTarjetaSuerte);
                tarjetaSuerte.setConDuenio(true);
                mensaje = nickname + "-ActualizaTarjeta-suerte" + ";" + getSiguienteJugadorTirarDados(getJugadorTurnoActual()) + mensajeSiguienteTurno;
                if (!this.mensajeATodos.isEmpty()) {
                    this.mensajeATodos += ";";
                }
                this.mensajeATodos += mensaje;
                break;
            case "-salgaCarcelA-":
                for (Jugador jugador : jugadores) {
                    if (jugador.getNickname().compareTo(nickname) == 0) {
                        jugador.setSalgaCarcelArca(true);
                    }
                }
                Tarjeta tarjetaArca = (Tarjeta) tarjetasArcaComunal.getObject(keyTarjetaArca);
                tarjetaArca.setConDuenio(true);
                mensaje = nickname + "-ActualizaTarjeta-arca" + ";" + getSiguienteJugadorTirarDados(getJugadorTurnoActual()) + mensajeSiguienteTurno;
                if (!this.mensajeATodos.isEmpty()) {
                    this.mensajeATodos += ";";
                }
                this.mensajeATodos += mensaje;
                break;
            case "-aCasillero11-":
                for (Jugador jugador : jugadores) {
                    if (jugador.getNickname().compareTo(nickname) == 0) {
                        if (jugador.getPosicionTablero() <= 39 && jugador.getPosicionTablero() > 11) {
                            mensaje = pasoPorSalida(nickname) + ";";
                        }
                        jugador.setPosicionTablero(11);
                    }
                }
                mensaje += nickname + "-ActualizaTablero-" + 11;
                if (!this.mensajeATodos.isEmpty()) {
                    this.mensajeATodos += ";";
                }
                this.mensajeATodos += mensaje;
                break;
            case "-cobra150banco-":
                for (Jugador jugador : jugadores) {
                    if (jugador.getNickname().compareTo(nickname) == 0) {
                        jugador.aumentarDinero(150);
                        dinero = jugador.getDinero();
                    }
                }
                mensaje = nickname + "-ActualizaDinero-" + dinero + ";" + getSiguienteJugadorTirarDados(getJugadorTurnoActual()) + mensajeSiguienteTurno;
                if (!this.mensajeATodos.isEmpty()) {
                    this.mensajeATodos += ";";
                }
                this.mensajeATodos += mensaje;
                break;
            case "-paga15banco-":
                switch (calcularSiPuedePagar(nickname, 15)) {
                    case -1:
                        bancarrota(nickname, "Banco");
                        return;
                    case 2:
                        this.mensajeEnParticular += ";" + nickname + "-mostrarOpcionesPagoSoloCasas-" + "15";
                        this.nickDuenioPagar = "banco";
                        this.alquilerAPagar = 15;
                        return;
                    case 3:
                        this.mensajeEnParticular += ";" + nickname + "-mostrarOpcionesPagoSoloHipotecas-" + "15";
                        this.nickDuenioPagar = "banco";
                        this.alquilerAPagar = 15;
                        return;
                    case 4:
                        this.mensajeEnParticular += ";" + nickname + "-mostrarOpcionesPagoAmbos-" + "15";
                        this.nickDuenioPagar = "banco";
                        this.alquilerAPagar = 15;
                        return;
                }
                for (Jugador jugador : jugadores) {
                    if (jugador.getNickname().compareTo(nickname) == 0) {
                        jugador.disminuirDinero(15);
                        dinero = jugador.getDinero();
                    }
                }
                mensaje = nickname + "-ActualizaDinero-" + dinero + ";" + getSiguienteJugadorTirarDados(getJugadorTurnoActual()) + mensajeSiguienteTurno;
                if (!this.mensajeATodos.isEmpty()) {
                    this.mensajeATodos += ";";
                }
                this.mensajeATodos += mensaje;
                break;
            case "-paga50jugador-":
                mensaje = "";
                int precio = 50 * jugadores.size() - 1;
                switch (calcularSiPuedePagar(nickname, precio)) {
                    case -1:
                        bancarrota(nickname, "Banco");
                        return;
                    case 2:
                        this.mensajeEnParticular += ";" + nickname + "-mostrarOpcionesPagoSoloCasas-" + precio;
                        this.nickDuenioPagar = "banco";
                        this.alquilerAPagar = precio;
                        return;
                    case 3:
                        this.mensajeEnParticular += ";" + nickname + "-mostrarOpcionesPagoSoloHipotecas-" + precio;
                        this.nickDuenioPagar = "banco";
                        this.alquilerAPagar = precio;
                        return;
                    case 4:
                        this.mensajeEnParticular += ";" + nickname + "-mostrarOpcionesPagoAmbos-" + precio;
                        this.nickDuenioPagar = "banco";
                        this.alquilerAPagar = precio;
                        return;
                }
                for (Jugador jugador : jugadores) {
                    if (jugador.getNickname().compareTo(nickname) == 0) {
                        jugador.disminuirDinero(precio);
                        dinero = jugador.getDinero();
                        if (mensaje.equals("")) {
                            mensaje += jugador.getNickname() + "-ActualizaDinero-" + dinero;
                        } else {
                            mensaje += ";" + jugador.getNickname() + "-ActualizaDinero-" + dinero;
                        }

                    } else {
                        jugador.aumentarDinero(50);
                        dinero = jugador.getDinero();
                        if (mensaje.equals("")) {
                            mensaje += jugador.getNickname() + "-ActualizaDinero-" + dinero;
                        } else {
                            mensaje += ";" + jugador.getNickname() + "-ActualizaDinero-" + dinero;
                        }
                    }
                }
                mensaje += ";" + getSiguienteJugadorTirarDados(getJugadorTurnoActual()) + mensajeSiguienteTurno;
                if (!this.mensajeATodos.isEmpty()) {
                    this.mensajeATodos += ";";
                }
                this.mensajeATodos += mensaje;
                break;
            case "-aCasillero5-":
                for (Jugador jugador : jugadores) {
                    if (jugador.getNickname().compareTo(nickname) == 0) {
                        if (jugador.getPosicionTablero() <= 39 && jugador.getPosicionTablero() > 5) {
                            mensaje = pasoPorSalida(nickname) + ";";
                        }
                        jugador.setPosicionTablero(5);
                    }
                }
                mensaje += nickname + "-ActualizaTablero-" + 5;
                if (!this.mensajeATodos.isEmpty()) {
                    this.mensajeATodos += ";";
                }
                this.mensajeATodos += mensaje;
                break;
            case "-pagueXCasaXHotel-":
                int cantCasas = cantidadDeCasas(nickname);
                int cantHoteles = cantidadDeHoteles(nickname);
                dinero = cantCasas * 25 + cantHoteles * 100;
                switch (calcularSiPuedePagar(nickname, dinero)) {
                    case -1:
                        bancarrota(nickname, "Banco");
                        return;
                    case 2:
                        this.mensajeEnParticular += ";" + nickname + "-mostrarOpcionesPagoSoloCasas-" + dinero;
                        this.nickDuenioPagar = "banco";
                        this.alquilerAPagar = dinero;
                        return;
                    case 3:
                        this.mensajeEnParticular += ";" + nickname + "-mostrarOpcionesPagoSoloHipotecas-" + dinero;
                        this.nickDuenioPagar = "banco";
                        this.alquilerAPagar = dinero;
                        return;
                    case 4:
                        this.mensajeEnParticular += ";" + nickname + "-mostrarOpcionesPagoAmbos-" + dinero;
                        this.nickDuenioPagar = "banco";
                        this.alquilerAPagar = dinero;
                        return;
                }
                for (Jugador jugador : jugadores) {
                    if (jugador.getNickname().compareTo(nickname) == 0) {
                        jugador.disminuirDinero(dinero);
                        dinero = jugador.getDinero();
                    }
                }
                mensaje = nickname + "-ActualizaDinero-" + dinero + ";" + getSiguienteJugadorTirarDados(getJugadorTurnoActual()) + mensajeSiguienteTurno;
                if (!this.mensajeATodos.isEmpty()) {
                    this.mensajeATodos += ";";
                }
                this.mensajeATodos += mensaje;
                break;
            case "-aUtilidad-":
                for (Jugador jugador : jugadores) {
                    if (jugador.getNickname().compareTo(nickname) == 0) {
                        posicion = jugador.moverAUtilidadCercana();
                    }
                }
                this.esDoble = this.tieneDuenio(posicion);
                mensaje = nickname + "-ActualizaTablero-" + posicion;
                if (!this.mensajeATodos.isEmpty()) {
                    this.mensajeATodos += ";";
                }
                this.mensajeATodos += mensaje;
                break;
            case "-aCasillero24-":
                for (Jugador jugador : jugadores) {
                    if (jugador.getNickname().compareTo(nickname) == 0) {
                        jugador.setPosicionTablero(24);
                    }
                }
                mensaje = nickname + "-ActualizaTablero-" + 24;
                if (!this.mensajeATodos.isEmpty()) {
                    this.mensajeATodos += ";";
                }
                this.mensajeATodos += mensaje;
                break;
            case "-paga100banco-":
                switch (calcularSiPuedePagar(nickname, 100)) {
                    case -1:
                        bancarrota(nickname, "Banco");
                        return;
                    case 2:
                        this.mensajeEnParticular += ";" + nickname + "-mostrarOpcionesPagoSoloCasas-" + "100";
                        this.nickDuenioPagar = "banco";
                        this.alquilerAPagar = 100;
                        return;
                    case 3:
                        this.mensajeEnParticular += ";" + nickname + "-mostrarOpcionesPagoSoloHipotecas-" + "100";
                        this.nickDuenioPagar = "banco";
                        this.alquilerAPagar = 100;
                        return;
                    case 4:
                        this.mensajeEnParticular += ";" + nickname + "-mostrarOpcionesPagoAmbos-" + "100";
                        this.nickDuenioPagar = "banco";
                        this.alquilerAPagar = 100;
                        return;
                }
                for (Jugador jugador : jugadores) {
                    if (jugador.getNickname().compareTo(nickname) == 0) {
                        jugador.disminuirDinero(100);
                        dinero = jugador.getDinero();
                    }
                }
                mensaje = nickname + "-ActualizaDinero-" + dinero + ";" + getSiguienteJugadorTirarDados(getJugadorTurnoActual()) + mensajeSiguienteTurno;
                if (!this.mensajeATodos.isEmpty()) {
                    this.mensajeATodos += ";";
                }
                this.mensajeATodos += mensaje;
                break;
            case "-pagueXCasaXHotelA-":
                cantCasas = cantidadDeCasas(nickname);
                cantHoteles = cantidadDeHoteles(nickname);
                dinero = cantCasas * 45 + cantHoteles * 115;
                switch (calcularSiPuedePagar(nickname, dinero)) {
                    case -1:
                        bancarrota(nickname, "Banco");
                        return;
                    case 2:
                        this.mensajeEnParticular += ";" + nickname + "-mostrarOpcionesPagoSoloCasas-" + dinero;
                        this.nickDuenioPagar = "banco";
                        this.alquilerAPagar = dinero;
                        return;
                    case 3:
                        this.mensajeEnParticular += ";" + nickname + "-mostrarOpcionesPagoSoloHipotecas-" + dinero;
                        this.nickDuenioPagar = "banco";
                        this.alquilerAPagar = dinero;
                        return;
                    case 4:
                        this.mensajeEnParticular += ";" + nickname + "-mostrarOpcionesPagoAmbos-" + dinero;
                        this.nickDuenioPagar = "banco";
                        this.alquilerAPagar = dinero;
                        return;
                }
                for (Jugador jugador : jugadores) {
                    if (jugador.getNickname().compareTo(nickname) == 0) {
                        jugador.disminuirDinero(dinero);
                        dinero = jugador.getDinero();
                    }
                }
                mensaje = nickname + "-ActualizaDinero-" + dinero + ";" + getSiguienteJugadorTirarDados(getJugadorTurnoActual()) + mensajeSiguienteTurno;
                if (!this.mensajeATodos.isEmpty()) {
                    this.mensajeATodos += ";";
                }
                this.mensajeATodos += mensaje;
                break;
            case "-cobra20banco-":
                for (Jugador jugador : jugadores) {
                    if (jugador.getNickname().compareTo(nickname) == 0) {
                        jugador.aumentarDinero(20);
                        dinero = jugador.getDinero();
                    }
                }
                mensaje = nickname + "-ActualizaDinero-" + dinero + ";" + getSiguienteJugadorTirarDados(getJugadorTurnoActual()) + mensajeSiguienteTurno;
                if (!this.mensajeATodos.isEmpty()) {
                    this.mensajeATodos += ";";
                }
                this.mensajeATodos += mensaje;
                break;
            case "-cobra10banco-":
                for (Jugador jugador : jugadores) {
                    if (jugador.getNickname().compareTo(nickname) == 0) {
                        jugador.aumentarDinero(10);
                        dinero = jugador.getDinero();
                    }
                }
                mensaje = nickname + "-ActualizaDinero-" + dinero + ";" + getSiguienteJugadorTirarDados(getJugadorTurnoActual()) + mensajeSiguienteTurno;
                if (!this.mensajeATodos.isEmpty()) {
                    this.mensajeATodos += ";";
                }
                this.mensajeATodos += mensaje;
                break;
            case "-cobra200banco-":
                for (Jugador jugador : jugadores) {
                    if (jugador.getNickname().compareTo(nickname) == 0) {
                        jugador.aumentarDinero(200);
                        dinero = jugador.getDinero();
                    }
                }
                mensaje = nickname + "-ActualizaDinero-" + dinero + ";" + getSiguienteJugadorTirarDados(getJugadorTurnoActual()) + mensajeSiguienteTurno;
                if (!this.mensajeATodos.isEmpty()) {
                    this.mensajeATodos += ";";
                }
                this.mensajeATodos += mensaje;
                break;
            case "-paga50banco-":
                switch (calcularSiPuedePagar(nickname, 50)) {
                    case -1:
                        bancarrota(nickname, "Banco");
                        return;
                    case 2:
                        this.mensajeEnParticular += ";" + nickname + "-mostrarOpcionesPagoSoloCasas-" + "50";
                        this.nickDuenioPagar = "banco";
                        this.alquilerAPagar = 50;
                        return;
                    case 3:
                        this.mensajeEnParticular += ";" + nickname + "-mostrarOpcionesPagoSoloHipotecas-" + "50";
                        this.nickDuenioPagar = "banco";
                        this.alquilerAPagar = 50;
                        return;
                    case 4:
                        this.mensajeEnParticular += ";" + nickname + "-mostrarOpcionesPagoAmbos-" + "50";
                        this.nickDuenioPagar = "banco";
                        this.alquilerAPagar = 50;
                        return;
                }
                for (Jugador jugador : jugadores) {
                    if (jugador.getNickname().compareTo(nickname) == 0) {
                        jugador.disminuirDinero(50);
                        dinero = jugador.getDinero();
                    }
                }
                mensaje = nickname + "-ActualizaDinero-" + dinero + ";" + getSiguienteJugadorTirarDados(getJugadorTurnoActual()) + mensajeSiguienteTurno;
                if (!this.mensajeATodos.isEmpty()) {
                    this.mensajeATodos += ";";
                }
                this.mensajeATodos += mensaje;
                break;
            case "-cobra25banco-":
                for (Jugador jugador : jugadores) {
                    if (jugador.getNickname().compareTo(nickname) == 0) {
                        jugador.aumentarDinero(25);
                        dinero = jugador.getDinero();
                    }
                }
                mensaje = nickname + "-ActualizaDinero-" + dinero + ";" + getSiguienteJugadorTirarDados(getJugadorTurnoActual()) + mensajeSiguienteTurno;
                if (!this.mensajeATodos.isEmpty()) {
                    this.mensajeATodos += ";";
                }
                this.mensajeATodos += mensaje;
                break;
            case "-paga150banco-":
                switch (calcularSiPuedePagar(nickname, 150)) {
                    case -1:
                        bancarrota(nickname, "Banco");
                        return;
                    case 2:
                        this.mensajeEnParticular += ";" + nickname + "-mostrarOpcionesPagoSoloCasas-" + "150";
                        this.nickDuenioPagar = "banco";
                        this.alquilerAPagar = 150;
                        return;
                    case 3:
                        this.mensajeEnParticular += ";" + nickname + "-mostrarOpcionesPagoSoloHipotecas-" + "150";
                        this.nickDuenioPagar = "banco";
                        this.alquilerAPagar = 150;
                        return;
                    case 4:
                        this.mensajeEnParticular += ";" + nickname + "-mostrarOpcionesPagoAmbos-" + "150";
                        this.nickDuenioPagar = "banco";
                        this.alquilerAPagar = 150;
                        return;
                }
                for (Jugador jugador : jugadores) {
                    if (jugador.getNickname().compareTo(nickname) == 0) {
                        jugador.disminuirDinero(150);
                        dinero = jugador.getDinero();
                    }
                }
                mensaje = nickname + "-ActualizaDinero-" + dinero + ";" + getSiguienteJugadorTirarDados(getJugadorTurnoActual()) + mensajeSiguienteTurno;
                if (!this.mensajeATodos.isEmpty()) {
                    this.mensajeATodos += ";";
                }
                this.mensajeATodos += mensaje;
                break;
            case "-cobra100banco-":
                for (Jugador jugador : jugadores) {
                    if (jugador.getNickname().compareTo(nickname) == 0) {
                        jugador.aumentarDinero(100);
                        dinero = jugador.getDinero();
                    }
                }
                mensaje = nickname + "-ActualizaDinero-" + dinero + ";" + getSiguienteJugadorTirarDados(getJugadorTurnoActual()) + mensajeSiguienteTurno;
                if (!this.mensajeATodos.isEmpty()) {
                    this.mensajeATodos += ";";
                }
                this.mensajeATodos += mensaje;
                break;
            case "-cobra50jugador-":
                mensaje = "";
                for (Jugador jugador : jugadores) {
                    if (jugador.getNickname().compareTo(nickname) == 0) {
                        jugador.aumentarDinero(50);
                        dinero = jugador.getDinero();
                        if (mensaje.equals("")) {
                            mensaje += jugador.getNickname() + "-ActualizaDinero-" + dinero;
                        } else {
                            mensaje += ";" + jugador.getNickname() + "-ActualizaDinero-" + dinero;
                        }

                    } else {
                        jugador.disminuirDinero(50);
                        dinero = jugador.getDinero();
                        if (mensaje.equals("")) {
                            mensaje += jugador.getNickname() + "-ActualizaDinero-" + dinero;
                        } else {
                            mensaje += ";" + jugador.getNickname() + "-ActualizaDinero-" + dinero;
                        }
                    }
                }
                mensaje += ";" + getSiguienteJugadorTirarDados(getJugadorTurnoActual()) + mensajeSiguienteTurno;
                if (!this.mensajeATodos.isEmpty()) {
                    this.mensajeATodos += ";";
                }
                this.mensajeATodos += mensaje;
                break;
            case "-cobra45banco-":
                for (Jugador jugador : jugadores) {
                    if (jugador.getNickname().compareTo(nickname) == 0) {
                        jugador.aumentarDinero(45);
                        dinero = jugador.getDinero();
                    }
                }
                mensaje = nickname + "-ActualizaDinero-" + dinero + ";" + getSiguienteJugadorTirarDados(getJugadorTurnoActual()) + mensajeSiguienteTurno;
                if (!this.mensajeATodos.isEmpty()) {
                    this.mensajeATodos += ";";
                }
                this.mensajeATodos += mensaje;
                break;
        }
    }

    public void informarPosicionJugador(String nickname, int posicion) {
        analizarCasillero(posicion, nickname);
        socketServidor.enviarMensajeSinPartConPartATodos(nickname, mensajeEnParticular, mensajeSinParticular, mensajeATodos);
        if (mensajeATodos.contains("gano")) {
            socketServidor.stop();
            socketServidor.close();
        }
        this.resetearVariablesMensajes();
    }

    private boolean estaEnLaCarcel(String nickname) {
        for (Jugador jugador : jugadores) {
            if (jugador.getNickname().compareTo(nickname) == 0) {
                return jugador.isMigliore();
            }
        }
        return false;
    }

    public void salirCarcel(String nickname, String saleCarcel) {
        String mensaje = nickname + "-TiraLosDados-";
        if (saleCarcel.compareTo("TruePagando") == 0) {
            int dinero = disminuirDineroJugador(50, nickname);
            sacarCarcel(nickname);
            mensaje += ";" + nickname + "-ActualizaDinero-" + dinero + ";" + nickname + "-EnCarcel-false";
        }
        if (saleCarcel.compareTo("tarjSuerte") == 0) {
            sacarCarcelConTarjeta(nickname, "Suerte");
            mensaje += ";" + nickname + "-ActualizaTarjeta-suerte" + ";" + nickname + "-EnCarcel-false";
        }
        if (saleCarcel.compareTo("tarjArca") == 0) {
            sacarCarcelConTarjeta(nickname, "Arca");
            mensaje += ";" + nickname + "-ActualizaTarjeta-arca" + ";" + nickname + "-EnCarcel-false";
        }
        if (saleCarcel.compareTo("probarSuerte") == 0) {
        } else {
            socketServidor.enviarMensaje(mensaje);
        }
    }

    private void sacarCarcel(String nickname) {
        for (Jugador jugador : jugadores) {
            if (jugador.getNickname().compareTo(nickname) == 0) {
                jugador.setMigliore(false);
                jugador.setCantTiroCarcel(0);
                return;
            }
        }
    }

    private int corroborarTarjetasDeSalirDeCarcel(String siguienteJugador) {
        int tarj = 0;
        for (Jugador jugador : jugadores) {
            if (jugador.getNickname().compareTo(siguienteJugador) == 0) {
                if (jugador.isSalgaCarcelSuerte()) {
                    tarj += 1;
                }
                if (jugador.isSalgaCarcelArca()) {
                    tarj += 2;
                }
            }
        }
        return tarj;
    }

    private void sacarCarcelConTarjeta(String nickname, String tarjetaNombre) {
        for (Jugador jugador : jugadores) {
            if (jugador.getNickname().compareTo(nickname) == 0) {
                jugador.setMigliore(false);
                jugador.setCantTiroCarcel(0);
                if (tarjetaNombre.compareTo("Suerte") == 0) {
                    jugador.setSalgaCarcelSuerte(false);
                    Tarjeta tarjeta = (Tarjeta) tarjetasSuerte.getObject(keyTarjetaSuerte);
                    tarjeta.setConDuenio(false);
                } else {
                    jugador.setSalgaCarcelArca(false);
                    Tarjeta tarjeta = (Tarjeta) tarjetasArcaComunal.getObject(keyTarjetaArca);
                    tarjeta.setConDuenio(false);
                }
                return;
            }
        }
    }

    private String estaComoMigliore() {
        String mensajeSiguienteTurno = "-TiraLosDados-";
        String siguienteJugador = getSiguienteJugadorTirarDados(getJugadorTurnoActual());
        if (estaEnLaCarcel(siguienteJugador)) {
            aumentarTirosCarcel(siguienteJugador);
            mensajeSiguienteTurno = "-EstaPreso-";
            mensajeSiguienteTurno += calcularSiPuedePagar(siguienteJugador, 50) == 1 ? "true" : "false";
            switch (corroborarTarjetasDeSalirDeCarcel(siguienteJugador)) {
                case 0:
                    mensajeSiguienteTurno += "/false/false";
                    break;
                case 1:
                    mensajeSiguienteTurno += "/true/false";
                    break;
                case 2:
                    mensajeSiguienteTurno += "/false/true";
                    break;
                case 3:
                    mensajeSiguienteTurno += "/true/true";
                    break;
            }
            if (cantidadTirosCarcel(siguienteJugador) > 3 && !mensajeSiguienteTurno.contains("true")) {
                switch (calcularSiPuedePagar(siguienteJugador, 50)) {
                    case -1:
                        bancarrota(siguienteJugador, "Banco");
                        break;
                    case 2:
                        this.mensajeEnParticular = siguienteJugador + "-mostrarOpcionesPagoSoloCasas-" + alquilerAPagar;
                        this.nickDuenioPagar = "banco";
                        this.alquilerAPagar = 50;
                        break;
                    case 3:
                        this.mensajeEnParticular = siguienteJugador + "-mostrarOpcionesPagoSoloHipotecas-" + alquilerAPagar;
                        this.nickDuenioPagar = "banco";
                        this.alquilerAPagar = 50;
                        break;
                    case 4:
                        this.mensajeEnParticular = siguienteJugador + "-mostrarOpcionesPagoAmbos-" + alquilerAPagar;
                        this.nickDuenioPagar = "banco";
                        this.alquilerAPagar = 50;
                        break;
                }
            }
            mensajeSiguienteTurno += cantidadTirosCarcel(siguienteJugador) > 3 ? "/true" : "/false";
        }
        return mensajeSiguienteTurno;
    }

    private void reiniciarVariablesSubasta() {
        this.idTerrenoEnSubasta = "";
        for (int i = 0; i < jugadores.size(); i++) {
            if (!jugadores.get(i).isBancarrota()) {
                jugadores.get(i).setEnSubasta(true);
                jugadores.get(i).setUltimaOferta(0);
            } else {
                jugadores.get(i).setEnSubasta(false);
            }
        }
    }

    private void asignarUltimaOferta(String nickname, String oferta) {
        for (int i = 0; i < jugadores.size(); i++) {
            if (jugadores.get(i).getNickname().compareTo(nickname) == 0) {
                jugadores.get(i).setUltimaOferta(Integer.parseInt(oferta));
            }
        }
    }

    private String terminoSubasta() {
        int contadorJugadoresEnSubasta = 0;
        Jugador ganador = null;
        for (int i = 0; i < jugadores.size(); i++) {
            if (contadorJugadoresEnSubasta > 1) {
                return "";
            }
            if (jugadores.get(i).isEnSubasta()) {
                contadorJugadoresEnSubasta++;
                ganador = jugadores.get(i);
            }
        }
        if (contadorJugadoresEnSubasta == 1) {
            if (ganador != null) {
                if (ganador.getUltimaOferta() == 0) {
                    return ganador.getNickname() + "/preguntarComprarA1";
                } else {
                    return ganador.getNickname();
                }
            }
        }
        return "";
    }

    private int obtenerUltimaOfertaJugador(String nickGanador) {
        for (int i = 0; i < jugadores.size(); i++) {
            if (jugadores.get(i).getNickname().compareTo(nickGanador) == 0) {
                return jugadores.get(i).getUltimaOferta();
            }
        }
        return -1;
    }

    public void listarPropiedadesDeshipotecadasJugador(String nickname, boolean esPorPreso) {
        String mensaje = nickname + "-listarPropiedadesJugador-" + esPorPreso + "";
        Casillero c;
        Propiedad p;
        Ferrocarril f;
        ServicioPublico s;
        for (int i = 0; i < jugadores.size(); i++) {
            if (jugadores.get(i).getNickname().compareTo(nickname) == 0) {
                LinkedList<Integer> propiedades = jugadores.get(i).getPropiedades();
                if (propiedades.size() == 0) {
                    socketServidor.enviarMensajeEnParticular(nickname, mensaje + "-noTiene/");
                    this.setHaciendoAlgo(nickname, false);
                    return;
                }
                this.setHaciendoAlgo(nickname, true);
                for (int j = 0; j < propiedades.size(); j++) {
                    c = (Casillero) casilleros.getObject(propiedades.get(j));
                    switch (c.getTipo()) {
                        case "Propiedad":
                            p = (Propiedad) c;
                            if (!p.isEsHipotecado() && !tieneConstrucciones(p)) {
                                mensaje += "-" + p.getIdCasillero() + "/" + p.getNombre() + "/" + p.getColor() + "/" + p.getValorHipotecario();
                            }
                            break;
                        case "Servicio":
                            s = (ServicioPublico) c;
                            if (!s.isEsHipotecado()) {
                                mensaje += "-" + s.getIdCasillero() + "/" + s.getNombre() + "/" + "Servicio" + "/" + s.getValorHipotecario();
                            }
                            break;
                        case "Ferrocarril":
                            f = (Ferrocarril) c;
                            if (!f.isEsHipotecado()) {
                                mensaje += "-" + f.getIdCasillero() + "/" + f.getNombre() + "/" + "Ferrocarril" + "/" + f.getValorHipotecario();
                            }
                            break;

                    }
                }
                if (mensaje.endsWith("PropiedadesJugador-" + esPorPreso + "")) {
                    socketServidor.enviarMensajeEnParticular(nickname, mensaje + "-noTiene/");
                    this.setHaciendoAlgo(nickname, false);
                    return;
                }
                String mensajeHistorialOtros = nickname + "-Historial- esta hipotecando.;" + nickname + "-estaRealizandoUnaAccion-true";
                socketServidor.enviarMensajesParticularYOtros(mensaje, nickname, mensajeHistorialOtros);
            }
        }
    }

    public void hipotecar(String nickname, String propiedades, boolean finalH) {
        Casillero casillero;
        Propiedad propiedad;
        Ferrocarril ferrocarril;
        ServicioPublico servicioPublico;
        int indiceDeBarra = propiedades.indexOf("/");
        int indiceSegundaBarra;
        int idCasilleroAHipotecar;
        String mensaje = nickname + "-ActualizaTableroHipoteca-", nombreAHipotecar = "";
        String hipotecadasHistorial = "";
        if (indiceDeBarra == -1) {
            idCasilleroAHipotecar = Integer.parseInt(propiedades.substring(0));
        } else {
            idCasilleroAHipotecar = Integer.parseInt(propiedades.substring(0, indiceDeBarra));
        }
        casillero = (Casillero) casilleros.getObject(idCasilleroAHipotecar);
        if (casillero.getTipo().compareTo("Propiedad") == 0) {
            propiedad = (Propiedad) casillero;
            propiedad.setEsHipotecado(true);
            this.aumentarDineroJugador(propiedad.getValorHipotecario(), nickname);
            nombreAHipotecar = propiedad.getNombre();
        } else if (casillero.getTipo().compareTo("Ferrocarril") == 0) {
            ferrocarril = (Ferrocarril) casillero;
            ferrocarril.setEsHipotecado(true);
            this.aumentarDineroJugador(ferrocarril.getValorHipotecario(), nickname);
            nombreAHipotecar = ferrocarril.getNombre();
        } else if (casillero.getTipo().compareTo("Servicio") == 0) {
            servicioPublico = (ServicioPublico) casillero;
            servicioPublico.setEsHipotecado(true);
            this.aumentarDineroJugador(servicioPublico.getValorHipotecario(), nickname);
            nombreAHipotecar = servicioPublico.getNombre();
        }
        if (indiceDeBarra == -1) {
            mensaje += nombreAHipotecar;
            hipotecadasHistorial += nombreAHipotecar;
        } else {
            mensaje += nombreAHipotecar + "/";
            hipotecadasHistorial += nombreAHipotecar + " - ";
        }
        while (indiceDeBarra != -1) {
            indiceSegundaBarra = propiedades.indexOf("/", indiceDeBarra + 1);
            if (indiceSegundaBarra == -1) {
                idCasilleroAHipotecar = Integer.parseInt(propiedades.substring(indiceDeBarra + 1));
            } else {
                idCasilleroAHipotecar = Integer.parseInt(propiedades.substring(indiceDeBarra + 1, indiceSegundaBarra));
            }
            casillero = (Casillero) casilleros.getObject(idCasilleroAHipotecar);
            if (casillero.getTipo().compareTo("Propiedad") == 0) {
                propiedad = (Propiedad) casillero;
                propiedad.setEsHipotecado(true);
                this.aumentarDineroJugador(propiedad.getValorHipotecario(), nickname);
                nombreAHipotecar = propiedad.getNombre();
            } else if (casillero.getTipo().compareTo("Ferrocarril") == 0) {
                ferrocarril = (Ferrocarril) casillero;
                ferrocarril.setEsHipotecado(true);
                this.aumentarDineroJugador(ferrocarril.getValorHipotecario(), nickname);
                nombreAHipotecar = ferrocarril.getNombre();
            } else if (casillero.getTipo().compareTo("Servicio") == 0) {
                servicioPublico = (ServicioPublico) casillero;
                servicioPublico.setEsHipotecado(true);
                this.aumentarDineroJugador(servicioPublico.getValorHipotecario(), nickname);
                nombreAHipotecar = servicioPublico.getNombre();
            }
            indiceDeBarra = indiceSegundaBarra;
            if (indiceDeBarra == -1) {
                mensaje += nombreAHipotecar;
                hipotecadasHistorial += nombreAHipotecar;
            } else {
                mensaje += nombreAHipotecar + "/";
                hipotecadasHistorial += nombreAHipotecar + " - ";
            }
        }
        mensaje += ";" + nickname + "-ActualizaDinero-" + this.getDineroJugador(nickname);
        mensaje += ";" + nickname + "-Historial- hipotecó las siguientes propiedades: " + hipotecadasHistorial;
        mensaje += ";" + nickname + "-estaRealizandoUnaAccion-false";
        this.setHaciendoAlgo(nickname, false);
        this.mensajeATodos = mensaje;
        if (!finalH) {
            this.socketServidor.enviarMensaje(this.mensajeATodos);
            resetearVariablesMensajes();
        }
    }

    private String getDineroJugador(String nickname) {
        String dinero = "";
        for (int i = 0; i < jugadores.size(); i++) {
            if (jugadores.get(i).getNickname().compareTo(nickname) == 0) {
                dinero = jugadores.get(i).getDinero() + "";
            }
        }
        return dinero;
    }

    private boolean tieneConstrucciones(Propiedad p) {
        boolean tieneConstrucciones = false;
        for (int i = 0; i < casilleros.size(); i++) {
            if (casilleros.getObject(i) instanceof Propiedad) {
                if (((Propiedad) casilleros.getObject(i)).getColor().compareTo(p.getColor()) == 0) {
                    tieneConstrucciones = tieneConstrucciones || ((Propiedad) casilleros.getObject(i)).getCantCasas() > 0;
                }
            }
        }
        return tieneConstrucciones;
    }

    public void listarPropiedadesHipotecadasJugador(String nickname) {
        String mensaje = nickname + "-listarPropiedadesHipotecadasJugador";
        Casillero c;
        Propiedad p;
        Ferrocarril f;
        ServicioPublico s;
        for (int i = 0; i < jugadores.size(); i++) {
            if (jugadores.get(i).getNickname().compareTo(nickname) == 0) {
                if (jugadores.get(i).getPropiedades().size() == 0) {
                    socketServidor.enviarMensajeEnParticular(nickname, mensaje + "-noTiene/");
                    this.setHaciendoAlgo(nickname, false);
                    return;
                }
                this.setHaciendoAlgo(nickname, true);
                for (int j = 0; j < jugadores.get(i).getPropiedades().size(); j++) {
                    c = (Casillero) casilleros.getObject(jugadores.get(i).getPropiedades().get(j));
                    switch (c.getTipo()) {
                        case "Propiedad":
                            p = (Propiedad) c;
                            if (p.isEsHipotecado()) {
                                mensaje += "-" + p.getIdCasillero() + "/" + p.getNombre() + "/" + p.getColor() + "/" + p.getCostoDeshipoteca();
                            }
                            break;
                        case "Servicio":
                            s = (ServicioPublico) c;
                            if (s.isEsHipotecado()) {
                                mensaje += "-" + s.getIdCasillero() + "/" + s.getNombre() + "/" + "Servicio" + "/" + s.getCostoDeshipoteca();
                            }
                            break;
                        case "Ferrocarril":
                            f = (Ferrocarril) c;
                            if (f.isEsHipotecado()) {
                                mensaje += "-" + f.getIdCasillero() + "/" + f.getNombre() + "/" + "Ferrocarril" + "/" + f.getCostoDeshipoteca();
                            }
                            break;

                    }
                }
                if (mensaje.endsWith("HipotecadasJugador")) {
                    socketServidor.enviarMensajeEnParticular(nickname, mensaje + "-noTiene/");
                    this.setHaciendoAlgo(nickname, false);
                    return;
                }
                String mensajeHistorialOtros = nickname + "-Historial- esta deshipotecando.;" + nickname + "-estaRealizandoUnaAccion-true";
                socketServidor.enviarMensajesParticularYOtros(mensaje, nickname, mensajeHistorialOtros);
            }
        }
    }

    public void deshipotecar(String nickname, String propiedades) {
        Casillero casillero;
        Propiedad propiedad;
        Ferrocarril ferrocarril;
        ServicioPublico servicioPublico;
        int indiceDeBarra = propiedades.indexOf("/");
        int indiceSegundaBarra;
        int idCasilleroAHipotecar;
        String mensaje = nickname + "-ActualizaTableroDeshipoteca-", nombreADeshipotecar = "";
        String deshipotecadasHistorial = "";
        if (indiceDeBarra == -1) {
            idCasilleroAHipotecar = Integer.parseInt(propiedades.substring(0));
        } else {
            idCasilleroAHipotecar = Integer.parseInt(propiedades.substring(0, indiceDeBarra));
        }
        casillero = (Casillero) casilleros.getObject(idCasilleroAHipotecar);
        if (casillero.getTipo().compareTo("Propiedad") == 0) {
            propiedad = (Propiedad) casillero;
            propiedad.setEsHipotecado(false);
            this.disminuirDineroJugador(propiedad.getCostoDeshipoteca(), nickname);
            nombreADeshipotecar = propiedad.getNombre();
        } else if (casillero.getTipo().compareTo("Ferrocarril") == 0) {
            ferrocarril = (Ferrocarril) casillero;
            ferrocarril.setEsHipotecado(false);
            this.disminuirDineroJugador(ferrocarril.getCostoDeshipoteca(), nickname);
            nombreADeshipotecar = ferrocarril.getNombre();
        } else if (casillero.getTipo().compareTo("Servicio") == 0) {
            servicioPublico = (ServicioPublico) casillero;
            servicioPublico.setEsHipotecado(false);
            this.disminuirDineroJugador(servicioPublico.getCostoDeshipoteca(), nickname);
            nombreADeshipotecar = servicioPublico.getNombre();
        }
        if (indiceDeBarra == -1) {
            mensaje += nombreADeshipotecar;
            deshipotecadasHistorial += nombreADeshipotecar;
        } else {
            mensaje += nombreADeshipotecar + "/";
            deshipotecadasHistorial += nombreADeshipotecar + " - ";
        }
        while (indiceDeBarra != -1) {
            indiceSegundaBarra = propiedades.indexOf("/", indiceDeBarra + 1);
            if (indiceSegundaBarra == -1) {
                idCasilleroAHipotecar = Integer.parseInt(propiedades.substring(indiceDeBarra + 1));
            } else {
                idCasilleroAHipotecar = Integer.parseInt(propiedades.substring(indiceDeBarra + 1, indiceSegundaBarra));
            }
            casillero = (Casillero) casilleros.getObject(idCasilleroAHipotecar);
            if (casillero.getTipo().compareTo("Propiedad") == 0) {
                propiedad = (Propiedad) casillero;
                propiedad.setEsHipotecado(false);
                this.disminuirDineroJugador(propiedad.getCostoDeshipoteca(), nickname);
                nombreADeshipotecar = propiedad.getNombre();
            } else if (casillero.getTipo().compareTo("Ferrocarril") == 0) {
                ferrocarril = (Ferrocarril) casillero;
                ferrocarril.setEsHipotecado(false);
                this.disminuirDineroJugador(ferrocarril.getCostoDeshipoteca(), nickname);
                nombreADeshipotecar = ferrocarril.getNombre();
            } else if (casillero.getTipo().compareTo("Servicio") == 0) {
                servicioPublico = (ServicioPublico) casillero;
                servicioPublico.setEsHipotecado(false);
                this.disminuirDineroJugador(servicioPublico.getCostoDeshipoteca(), nickname);
                nombreADeshipotecar = servicioPublico.getNombre();
            }
            indiceDeBarra = indiceSegundaBarra;
            if (indiceDeBarra == -1) {
                mensaje += nombreADeshipotecar;
                deshipotecadasHistorial += nombreADeshipotecar;
            } else {
                mensaje += nombreADeshipotecar + "/";
                deshipotecadasHistorial += nombreADeshipotecar + " - ";
            }
        }
        //informar actualizacion de dinero, propiedades hipotecadas, mensaje historial, proximo turno
        mensaje += ";" + nickname + "-ActualizaDinero-" + this.getDineroJugador(nickname);
        mensaje += ";" + nickname + "-Historial- deshipotecó las siguientes propiedades: " + deshipotecadasHistorial;
        mensaje += ";" + nickname + "-estaRealizandoUnaAccion-false";
        //mensaje += ";" + getSiguienteJugadorTirarDados(getJugadorTurnoActual()) + estaComoMigliore();
        this.socketServidor.enviarMensaje(mensaje);
        this.setHaciendoAlgo(nickname, false);
    }

    private boolean hayAlguienHaciendoAlgo() {
        for (Jugador jugador : jugadores) {
            if (jugador.isRealizandoAccion()) {
                return true;
            }
        }
        return false;
    }

    private void setHaciendoAlgo(String nickname, boolean estado) {
        for (int i = 0; i < jugadores.size(); i++) {
            if (jugadores.get(i).getNickname().compareTo(nickname) == 0) {
                jugadores.get(i).setRealizandoAccion(estado);
                return;
            }
        }
    }

    public void canceloAccion(String nickname) {
        this.setHaciendoAlgo(nickname, false);
        socketServidor.enviarMensaje(nickname + "-estaRealizandoUnaAccion-false");
    }

    public void listarPropiedadesConstruccion(String nickname) {
        String mensaje = nickname + "-listarPropiedadesConstruccionJugador";
        Casillero c;
        Propiedad p;
        Ferrocarril f;
        ServicioPublico s;
        for (int i = 0; i < jugadores.size(); i++) {
            if (jugadores.get(i).getNickname().compareTo(nickname) == 0) {
                if (jugadores.get(i).getPropiedades().size() == 0) {
                    socketServidor.enviarMensajeEnParticular(nickname, mensaje + "-noTiene/");
                    return;
                }
                this.setHaciendoAlgo(nickname, true);
                for (int j = 0; j < jugadores.get(i).getPropiedades().size(); j++) {
                    c = (Casillero) casilleros.getObject(jugadores.get(i).getPropiedades().get(j));
                    if (c.getTipo().compareTo("Propiedad") == 0) {
                        p = (Propiedad) c;

                        if (this.poseeTodasLasPropiedades(p)) {
                            //hecho por franco
                            if (p.isEsHipotecado() == false && this.demasPropiedadesNoHipotecadas(p) == false) {
                                mensaje += "-" + p.getIdCasillero() + "/" + p.getNombre() + "/" + p.getColor() + "/" + p.getCantCasas() + "/" + p.getValorCasa();
                            }
                        }
                    }
                }
                if (mensaje.endsWith("ConstruccionJugador")) {
                    socketServidor.enviarMensajeEnParticular(nickname, mensaje + "-noTiene/");
                    this.setHaciendoAlgo(nickname, false);
                    return;
                }
                String mensajeHistorialOtros = nickname + "-Historial- esta construyendo.;" + nickname + "-estaRealizandoUnaAccion-true";
                socketServidor.enviarMensajesParticularYOtros(mensaje, nickname, mensajeHistorialOtros);
            }
        }
    }

    public void construirCasas(String propiedades, String nickname, boolean esFinal) {
        String mensaje = "-ActualizarCostrucciones-";
        this.setHaciendoAlgo(nickname, false);
        int indexIdCasillero = 0;
        int indexIdCantCasa = propiedades.indexOf("/");
        int indexProxProp = propiedades.indexOf("-", indexIdCantCasa);
        int idCasillero = Integer.parseInt(propiedades.substring(indexIdCasillero, indexIdCantCasa));
        int cantCasa;
        int difCasas;
        if (indexProxProp != -1) {
            cantCasa = Integer.parseInt(propiedades.substring(indexIdCantCasa + 1, indexProxProp));
        } else {
            cantCasa = Integer.parseInt(propiedades.substring(indexIdCantCasa + 1));
        }
        Propiedad p = (Propiedad) casilleros.getObject(idCasillero);
        difCasas = cantCasa - p.getCantCasas();
        if (difCasas < 0) {
            this.aumentarDineroJugador(Math.abs(difCasas) * (p.getValorCasa() / 2), nickname);
        } else {
            this.disminuirDineroJugador(difCasas * p.getValorCasa(), nickname);
        }
        p.setCantCasas(cantCasa);
        mensaje += p.getIdCasillero() + "/" + p.getCantCasas();
        while (indexProxProp != -1) {
            indexIdCasillero = indexProxProp + 1;
            indexIdCantCasa = propiedades.indexOf("/", indexIdCasillero);
            indexProxProp = propiedades.indexOf("-", indexIdCantCasa);
            if (indexProxProp != -1) {
                cantCasa = Integer.parseInt(propiedades.substring(indexIdCantCasa + 1, indexProxProp));
            } else {
                cantCasa = Integer.parseInt(propiedades.substring(indexIdCantCasa + 1));
            }
            idCasillero = Integer.parseInt(propiedades.substring(indexIdCasillero, indexIdCantCasa));
            p = (Propiedad) casilleros.getObject(idCasillero);
            difCasas = cantCasa - p.getCantCasas();
            if (difCasas < 0) {
                this.aumentarDineroJugador(Math.abs(difCasas) * (p.getValorCasa() / 2), nickname);
            } else {
                this.disminuirDineroJugador(difCasas * p.getValorCasa(), nickname);
            }
            p.setCantCasas(cantCasa);
            mensaje += "-" + p.getIdCasillero() + "/" + p.getCantCasas();
        }
        mensaje += ";" + nickname + "-ActualizaDinero-" + this.getDineroJugador(nickname) + ";" + nickname + "-estaRealizandoUnaAccion-false";
        this.mensajeATodos = mensaje;
        if (!esFinal) {
            socketServidor.enviarMensaje(mensaje);
            this.resetearVariablesMensajes();
        }
    }

    private int cantidadTirosCarcel(String nickname) {
        for (Jugador jugador : jugadores) {
            if (jugador.getNickname().compareTo(nickname) == 0) {
                return jugador.getCantTiroCarcel();
            }
        }
        return -1;
    }

    private void aumentarTirosCarcel(String nickname) {
        for (Jugador jugador : jugadores) {
            if (jugador.getNickname().compareTo(nickname) == 0) {
                jugador.setCantTiroCarcel(jugador.getCantTiroCarcel() + 1);
            }
        }
    }

    public void listarPropiedadesDeconstruccion(String nickname) {
        String mensaje = nickname + "-listarPropiedadesDeconstruccionJugador";
        Casillero c;
        Propiedad p;
        Ferrocarril f;
        ServicioPublico s;
        for (int i = 0; i < jugadores.size(); i++) {
            if (jugadores.get(i).getNickname().compareTo(nickname) == 0) {
                if (jugadores.get(i).getPropiedades().size() == 0) {
                    socketServidor.enviarMensajeEnParticular(nickname, mensaje + "-noTiene/");
                    return;
                }
                this.setHaciendoAlgo(nickname, true);
                for (int j = 0; j < jugadores.get(i).getPropiedades().size(); j++) {
                    c = (Casillero) casilleros.getObject(jugadores.get(i).getPropiedades().get(j));
                    if (c.getTipo().compareTo("Propiedad") == 0) {
                        p = (Propiedad) c;
                        if (p.getCantCasas() > 0) {
                            mensaje += "-" + p.getIdCasillero() + "/" + p.getNombre() + "/" + p.getColor() + "/" + p.getCantCasas() + "/" + (p.getValorCasa() / 2);
                        }
                    }
                }
                if (mensaje.endsWith("DeconstruccionJugador")) {
                    socketServidor.enviarMensajeEnParticular(nickname, mensaje + "-noTiene/");
                    this.setHaciendoAlgo(nickname, false);
                    return;
                }
                String mensajeHistorialOtros = nickname + "-Historial- esta vendiendo casas.;" + nickname + "-estaRealizandoUnaAccion-true";
                socketServidor.enviarMensajesParticularYOtros(mensaje, nickname, mensajeHistorialOtros);
            }
        }
    }

    public boolean contieneConstruccionesGrupo(Propiedad p) {
        boolean contConstruc = p.getCantCasas() > 0;
        LinkedList<Integer> propHnas = p.getHnos();
        for (Integer integer : propHnas) {
            contConstruc |= ((Propiedad) casilleros.getObject(integer)).getCantCasas() > 0;
        }
        return contConstruc;
    }

    public void listarPropiedadesJugadorParticular(String nickname, String nicknameParticular) {
        this.mensajeEnParticular = nickname + "-posesionesComerciar";
        if (nickname.compareTo(nicknameParticular) == 0) {
            this.mensajeEnParticular = nickname + "-posesionesComerciarPropias";
        }
        Jugador jug = this.getJugador(nicknameParticular);
        LinkedList<Integer> props = jug.getPropiedades();
        for (Integer integer : props) {
            Casillero cas = (Casillero) casilleros.getObject(integer);
            switch (cas.getTipo()) {
                case "Propiedad":
                    Propiedad p = (Propiedad) cas;
                    if (!contieneConstruccionesGrupo(p)) {
                        this.mensajeEnParticular += "-" + p.getIdCasillero() + "/" + p.getTipo() + "/" + p.getNombre() + "/" + p.getColor();
                    }
                    break;
                case "Ferrocarril":
                    Ferrocarril f = (Ferrocarril) cas;
                    this.mensajeEnParticular += "-" + f.getIdCasillero() + "/" + f.getTipo() + "/" + f.getNombre() + "/ferrocarril";
                    break;
                case "Servicio":
                    ServicioPublico s = (ServicioPublico) cas;
                    this.mensajeEnParticular += "-" + s.getIdCasillero() + "/" + s.getTipo() + "/" + s.getNombre() + "/servicio";
                    break;
            }
        }
        if (jug.isSalgaCarcelArca()) {
            this.mensajeEnParticular += "-666/tarjeta/Salga de la Carcel/arca";
        }
        if (jug.isSalgaCarcelSuerte()) {
            this.mensajeEnParticular += "-777/tarjeta/Salga de la Carcel/suerte";

        }
        if (this.mensajeEnParticular.endsWith("posesionesComerciar")) {
            this.mensajeEnParticular += "-noTiene";
        }
        if (this.mensajeEnParticular.endsWith("posesionesComerciarPropias")) {
            this.mensajeEnParticular += "-noTiene";
        }
        if (!this.estaRealizandoAccion(nickname)) {
            this.mensajeSinParticular = nickname + "-Historial- está comerciando.;" + nickname + "-estaRealizandoUnaAccion-true";
        }
        this.setHaciendoAlgo(nickname, true);
        socketServidor.enviarMensajesParticularYOtros(this.mensajeEnParticular, nickname, this.mensajeSinParticular);
        this.resetearVariablesMensajes();
    }

    private int puedeComprarHipotecando(String nickname, int precio) {
        Jugador jug = this.getJugador(nickname);
        int precioAcumuladoHipotecas = jug.getDinero();
        LinkedList<Integer> propiedades = jug.getPropiedades();
        for (Integer integer : propiedades) {
            Casillero cas = (Casillero) casilleros.getObject(integer);
            switch (cas.getTipo()) {
                case "Propiedad":
                    if (!((Propiedad) cas).isEsHipotecado() && !tieneConstrucciones(((Propiedad) cas))) {
                        precioAcumuladoHipotecas += ((Propiedad) cas).getValorHipotecario();
                    }
                    break;
                case "Ferrocarril":
                    if (!((Ferrocarril) cas).isEsHipotecado()) {
                        precioAcumuladoHipotecas += ((Ferrocarril) cas).getValorHipotecario();
                    }
                    break;
                case "Servicio":
                    if (!((ServicioPublico) cas).isEsHipotecado()) {
                        precioAcumuladoHipotecas += ((ServicioPublico) cas).getValorHipotecario();
                    }
                    break;
            }
        }
        return precioAcumuladoHipotecas;
    }

    public void comprarCasilla(String nickname, String propiedad) {
        int idCas = Integer.parseInt(propiedad);
        Casillero cas = (Casillero) casilleros.getObject(idCas);
        int precioCas = this.traerPrecioCasillero(cas);
        String mensaje, mensajeFinal = "";
        int posibilidadDePago = calcularSiPuedeComprar(nickname, precioCas);
        switch (posibilidadDePago) {
            case 1:
                switch (cas.getTipo()) {
                    case "Propiedad":
                        Propiedad prop = (Propiedad) cas;
                        mensaje = "Desea comprar " + prop.getNombre() + " al valor de $" + prop.getPrecio() + "?";
                        mensajeFinal = prop.getIdCasillero() + "-PreguntarComprarTerreno-" + mensaje;
                        break;
                    case "Ferrocarril":
                        Ferrocarril ferro = (Ferrocarril) cas;
                        mensaje = "Desea comprar " + ferro.getNombre() + " al valor de $" + ferro.getPrecio() + "?";
                        mensajeFinal = ferro.getIdCasillero() + "-PreguntarComprarTerreno-" + mensaje;
                        break;
                    case "Servicio":
                        ServicioPublico serv = (ServicioPublico) cas;
                        mensaje = "Desea comprar " + serv.getNombre() + " al valor de $" + serv.getPrecio() + "?";
                        mensajeFinal = serv.getIdCasillero() + "-PreguntarComprarTerreno-" + mensaje;
                        break;
                }
                break;
            case 2:
                mensajeFinal = nickname + "-PreguntarHipotecar-" + cas.getIdCasillero() + "/" + cas.getNombre();
                break;
            case 3:
                mensajeFinal = nickname + "-PreguntarVenderCasas-" + cas.getIdCasillero() + "/" + cas.getNombre();
                break;
            case 4:
                mensajeFinal = nickname + "-PreguntarVenderHipotecar-" + cas.getIdCasillero() + "/" + cas.getNombre();
                break;
            case -1:
                mensajeFinal = nickname + "-NoPuedeAdquirir-" + cas.getIdCasillero() + "/" + cas.getNombre();
                break;
        }

        this.mensajeEnParticular = mensajeFinal;
        socketServidor.enviarMensajeConParticular(this.mensajeEnParticular, nickname, this.mensajeATodos);
        resetearVariablesMensajes();
    }

    private boolean tieneDuenio(int posicion) {
        Casillero cas = (Casillero) casilleros.getObject(posicion);
        return cas.getDuenio().compareTo("") != 0;
    }

    public void hipotecarComprar(String nickname, String propiedades) {
    }

    public void comenzarSubastaC(String nick, String idTerreno) {
        this.idTerrenoEnSubasta = idTerreno;
        int nroCasillero = Integer.parseInt(idTerreno);
        Casillero casillero = (Casillero) casilleros.getObject(nroCasillero);
        String jugadorSiguienteAOfertar = getJugadorSiguienteOfertar(nick);
        String jugadorAMostrarEnOferta = jugadorSiguienteAOfertar;
        String precio = traerPrecioCasillero(casillero) + "";
        precio += ";" + nick + "-estaRealizandoUnaAccion-false";
        socketServidor.enviarMensajeSubasta(casillero.getNombre(), idTerreno, jugadorSiguienteAOfertar, jugadorAMostrarEnOferta, precio);
    }

    public void hipotecoPorPreso(String nick) {
        int dineroJugador = Integer.parseInt(this.getDineroJugador(nick));
        if (dineroJugador >= 50) {
            this.disminuirDineroJugador(50, nick);
            sacarCarcel(nick);
            this.mensajeATodos += ";" + nick + "-ActualizaDinero-" + this.getDineroJugador(nick) + ";" + nick + "-EnCarcel-false;" + nick + "-TiraLosDados-";
            socketServidor.enviarMensaje(this.mensajeATodos);
        }
    }

    public void pagarPorHipoConstru(String nick) {
        if (alquilerAPagar > Integer.parseInt(getDineroJugador(nick))) {
            int dinero = Integer.parseInt(getDineroJugador(nick));
            switch (calcularSiPuedePagar(nick, alquilerAPagar)) {
                case -1:
                    bancarrota(nick, "Banco");
                    break;
                case 2:
                    this.mensajeEnParticular += ";" + nick + "-mostrarOpcionesPagoSoloCasas-" + dinero;
                    break;
                case 3:
                    this.mensajeEnParticular += ";" + nick + "-mostrarOpcionesPagoSoloHipotecas-" + dinero;
                    break;
                case 4:
                    this.mensajeEnParticular += ";" + nick + "-mostrarOpcionesPagoAmbos-" + dinero;
                    break;
            }
            socketServidor.enviarMensajeSinPartConPartATodos(nick, this.mensajeEnParticular, "", this.mensajeATodos);
            this.resetearVariablesMensajes();
            return;
        }
        this.disminuirDineroJugador(alquilerAPagar, nick);
        if (this.nickDuenioPagar.compareTo("banco") != 0) {
            this.aumentarDineroJugador(alquilerAPagar, this.nickDuenioPagar);
            this.mensajeATodos += ";" + this.nickDuenioPagar + "-ActualizaDinero-" + this.getDineroJugador(this.nickDuenioPagar);
        }
        this.mensajeATodos += ";" + nick + "-ActualizaDinero-" + this.getDineroJugador(nick);
        this.mensajeATodos += ";" + getSiguienteJugadorTirarDados(getJugadorTurnoActual()) + estaComoMigliore();
        this.mensajeATodos += ";" + nick + "-Historial-pagó a " + nickDuenioPagar + " " + alquilerAPagar;
        socketServidor.enviarMensaje(this.mensajeATodos);
        this.nickDuenioPagar = "";
        alquilerAPagar = 0;
        this.resetearVariablesMensajes();
    }

    public void hipotecaPorSubasta(String nick) {
        int idTerreno = Integer.parseInt(idTerrenoEnSubasta);
        Casillero casillero = (Casillero) casilleros.getObject(idTerreno);
        casillero.setDuenio(nick);
        int dinero = 0;
        for (Jugador jugador : jugadores) {
            if (jugador.getNickname().compareTo(nick) == 0) {
                jugador.agregarPropiedad(idTerreno);
                jugador.disminuirDinero(1);
                dinero = jugador.getDinero();
            }
        }
        this.setHaciendoAlgo(nick, false);
        String mensajeCompra = nick + "-GanoSubasta-" + ";" + nick + "-ComproEnSubasta-" + casillero.getNombre() + "-" + 1;
        mensajeCompra += ";" + nick + "-ActualizaDinero-" + dinero;
        mensajeCompra += ";" + getSiguienteJugadorTirarDados(getJugadorTurnoActual()) + "-TiraLosDados-";
        mensajeCompra += ";" + nick + "-estaRealizandoUnaAccion-false";
        reiniciarVariablesSubasta();
        socketServidor.enviarMensaje(mensajeCompra);
    }

    public void noCompraPorSub(String nick) {
        this.setHaciendoAlgo(nick, false);
        String mensajeSubasta = "nadie" + "-GanoSubasta-" + ";" + getSiguienteJugadorTirarDados(getJugadorTurnoActual()) + "-TiraLosDados-" + ";" + nick + "-estaRealizandoUnaAccion-false";
        reiniciarVariablesSubasta();
        socketServidor.enviarMensaje(mensajeSubasta);
    }

    private int venderCasasPorBancarrota(String nickBancarrota) {
        LinkedList<Integer> propiedades = new LinkedList<>();
        int suma = 0;
        for (Jugador jugador : jugadores) {
            if (jugador.getNickname().compareTo(nickBancarrota) == 0) {
                propiedades = jugador.getPropiedades();
            }
        }
        for (Integer integer : propiedades) {
            Casillero cas = (Casillero) casilleros.getObject(integer);
            if (cas.getTipo().compareTo("Propiedad") == 0) {
                Propiedad p = (Propiedad) cas;
                suma += p.getCantCasas() * (p.getValorCasa() / 2);
                p.setCantCasas(0);
            }
        }
        return suma;
    }

    private String traspasoTarjetas(String nuevoDuenio, String duenioAnterior) {
        String mensaje = "";
        Jugador anteriorDuenio = this.getJugador(duenioAnterior);
        Jugador nuevoDuen = this.getJugador(nuevoDuenio);
        nuevoDuen.setSalgaCarcelArca(anteriorDuenio.isSalgaCarcelArca());
        nuevoDuen.setSalgaCarcelSuerte(anteriorDuenio.isSalgaCarcelSuerte());
        anteriorDuenio.setSalgaCarcelArca(false);
        anteriorDuenio.setSalgaCarcelSuerte(false);
        if (nuevoDuen.isSalgaCarcelArca()) {
            mensaje += nuevoDuenio + "-ActualizaTarjeta-arca;";
            mensaje += duenioAnterior + "-ActualizaTarjeta-arca";
        }
        if (nuevoDuen.isSalgaCarcelSuerte()) {
            if (!mensaje.isEmpty()) {
                mensaje += ";";
            }
            mensaje += nuevoDuenio + "-ActualizaTarjeta-suerte;";
            mensaje += duenioAnterior + "-ActualizaTarjeta-suerte";
        }
        return mensaje;
    }

    private Jugador getJugador(String nickname) {
        for (Jugador jugador : jugadores) {
            if (jugador.getNickname().compareTo(nickname) == 0) {
                return jugador;
            }
        }
        return null;
    }

    private String hipotecadasJugador(String nickDuenio, String nickBancarrota) {
        String mensaje = "";
        int pagarPropHipotecadas = 0;
        LinkedList<Integer> propiedades = this.getJugador(nickBancarrota).getPropiedades();
        Jugador jugadorDuenio = this.getJugador(nickDuenio);
        for (Integer integer : propiedades) {
            Casillero cas = (Casillero) casilleros.getObject(integer);
            switch (cas.getTipo()) {
                case "Propiedad":
                    Propiedad prop = (Propiedad) cas;
                    if (prop.isEsHipotecado()) {
                        pagarPropHipotecadas += prop.getCostoDeshipoteca() / 10;
                        jugadorDuenio.agregarPropiedadHipotecadaPorBancarrota(integer);
                    }
                    break;
                case "Ferrocarril":
                    Ferrocarril ferro = (Ferrocarril) cas;
                    if (ferro.isEsHipotecado()) {
                        pagarPropHipotecadas += ferro.getCostoDeshipoteca() / 10;
                        jugadorDuenio.agregarPropiedadHipotecadaPorBancarrota(integer);
                    }
                    break;
                case "Servicio":
                    ServicioPublico serv = (ServicioPublico) cas;
                    if (serv.isEsHipotecado()) {
                        pagarPropHipotecadas += serv.getCostoDeshipoteca() / 10;
                        jugadorDuenio.agregarPropiedadHipotecadaPorBancarrota(integer);
                    }
                    break;
            }
        }
        if (pagarPropHipotecadas > 0) {
            mensaje += nickDuenio + "-preguntarDeshipotecarBancarrota-" + nickBancarrota;
            mensaje += ";" + nickDuenio + "-Historial-El jugador " + nickDuenio + " pago " + pagarPropHipotecadas + " de impuesto por adquirir propiedades hipotecadas.";
        }
        return mensaje;
    }

    private int impuestoHipotecadas(String nickBancarrota) {
        int dinero = 0;
        LinkedList<Integer> propiedades = this.getJugador(nickBancarrota).getPropiedades();
        for (Integer integer : propiedades) {
            Casillero cas = (Casillero) casilleros.getObject(integer);
            switch (cas.getTipo()) {
                case "Propiedad":
                    Propiedad p = (Propiedad) cas;
                    if (p.isEsHipotecado()) {
                        dinero += p.getValorHipotecario() / 10;
                    }
                    break;
                case "Ferrocarril":
                    Ferrocarril f = (Ferrocarril) cas;
                    if (f.isEsHipotecado()) {
                        dinero += f.getValorHipotecario() / 10;
                    }
                    break;
                case "Servicio":
                    ServicioPublico s = (ServicioPublico) cas;
                    if (s.isEsHipotecado()) {
                        dinero += s.getValorHipotecario() / 10;
                    }
                    break;
            }
        }
        return dinero;
    }

    private String pasoPorSalida(String nickname) {
        Jugador jugador = this.getJugador(nickname);
        jugador.aumentarDinero(200);
        if (this.mensajeATodos.compareTo("") == 0) {
            return nickname + "-ActualizaDinero-" + jugador.getDinero() + ";" + nickname + "-Historial-cobró $200 por salida";
        } else {
            return ";" + nickname + "-ActualizaDinero-" + jugador.getDinero() + ";" + nickname + "-Historial-cobró $200 por salida";
        }
    }

    private void resetearVariablesMensajes() {
        this.mensajeATodos = "";
        this.mensajeEnParticular = "";
        this.mensajeSinParticular = "";
    }

    private boolean estaRealizandoAccion(String nickname) {
        return this.getJugador(nickname).isRealizandoAccion();
    }

    private int puedeComprarVendiendoCasas(String nickname, int precio) {
        Jugador jugador = this.getJugador(nickname);
        int cantDinero = jugador.getDinero();
        LinkedList<Integer> propiedades = jugador.getPropiedades();
        for (Integer prop : propiedades) {
            Casillero cas = (Casillero) casilleros.getObject(prop);
            if (cas instanceof Propiedad) {
                Propiedad p = (Propiedad) cas;
                cantDinero += p.getCantCasas() * p.getValorCasa() / 2;
            }
        }
        return cantDinero;
    }

    public void propuestaComerciar(String nickname, String propuesta) {
        String p[] = propuesta.split("/");
        String[] propiedadesPedidas = p[0].split("-");
        String[] propiedadesOfrecidas = p[1].split("-");
        String dineroOfrecido = p[2];
        String nickAPropuestar = p[3];
        String mensajeAMostrar = "El jugador " + nickname + " le ofrece el siguiente intercambio:barraene";
        propuesta = nickname + "/" + propuesta;
        if (!propiedadesPedidas[0].isEmpty()) {
            mensajeAMostrar += "Pedido:barraene";
            for (String string : propiedadesPedidas) {
                if (string.compareTo("666") == 0) {
                    mensajeAMostrar += "\t Salga de la carcel Arcabarraene";
                } else if (string.compareTo("777") == 0) {
                    mensajeAMostrar += "\t Salga de la carcel Suertebarraene";
                } else {
                    Casillero cas = (Casillero) casilleros.getObject(Integer.parseInt(string));
                    mensajeAMostrar += "\t" + cas.getNombre() + "barraene";
                }
            }
        }
        mensajeAMostrar += "Ofrece lo siguiente:barraene";
        if (!propiedadesOfrecidas[0].isEmpty()) {
            for (String string : propiedadesOfrecidas) {
                if (string.compareTo("666") == 0) {
                    mensajeAMostrar += "\t Salga de la carcel Arcabarraene";
                } else if (string.compareTo("777") == 0) {
                    mensajeAMostrar += "\t Salga de la carcel Suertebarraene";
                } else {
                    Casillero cas = (Casillero) casilleros.getObject(Integer.parseInt(string));
                    mensajeAMostrar += "\t" + cas.getNombre() + "barraene";
                }
            }
        }
        if (!dineroOfrecido.equals("0")) {
            mensajeAMostrar += "\tDinero: " + dineroOfrecido + "barraene";
        }
        mensajeAMostrar += "Acepta la propuesta?";
        this.mensajeEnParticular = nickAPropuestar + "-propuestaIntercambio-" + mensajeAMostrar + "-" + propuesta;
        socketServidor.enviarMensajeEnParticular(nickAPropuestar, mensajeEnParticular);
        resetearVariablesMensajes();
    }

    public void respuestaPropuestaComerciar(String nickname, String propuesta) {
        String[] p = propuesta.split("/");
        String nickOfrecio = p[0];
        String[] propiedadesPedidas = p[1].split("-");
        String[] propiedadesOfrecidas = p[2].split("-");
        String dineroOfrecido = p[3];
        String nickAPropuestar = p[4];
        String respuesta = p[5];
        if (respuesta.equals("No")) {
            this.setHaciendoAlgo(nickOfrecio, false);
            this.mensajeATodos = nickOfrecio + "-estaRealizandoUnaAccion-false";
            this.mensajeEnParticular = nickOfrecio + "-resultadoIntercambio-" + respuesta;
            socketServidor.enviarMensajeConParticular(mensajeEnParticular, nickOfrecio, mensajeATodos);
            resetearVariablesMensajes();
            return;
        }
        this.mensajeEnParticular = nickOfrecio + "-resultadoIntercambio-" + respuesta;
        this.aumentarDineroJugador(Integer.parseInt(dineroOfrecido), nickAPropuestar);
        this.disminuirDineroJugador(Integer.parseInt(dineroOfrecido), nickOfrecio);
        this.mensajeATodos = nickAPropuestar + "-ActualizaDinero-" + this.getDineroJugador(nickAPropuestar) + ";" + nickOfrecio + "-ActualizaDinero-" + this.getDineroJugador(nickOfrecio);
        this.mensajeATodos += ";" + nickOfrecio + "-Historial-comerció con " + nickAPropuestar;
        if (!propiedadesPedidas[0].isEmpty()) {
            for (String string : propiedadesPedidas) {
                if (string.compareTo("666") == 0) {
                    this.getJugador(nickOfrecio).setSalgaCarcelArca(true);
                    this.getJugador(nickAPropuestar).setSalgaCarcelArca(false);
                    this.mensajeATodos += ";" + nickAPropuestar + "-ActualizaTarjeta-arca";
                    this.mensajeATodos += ";" + nickOfrecio + "-ActualizaTarjeta-arca";
                } else if (string.compareTo("777") == 0) {
                    this.getJugador(nickOfrecio).setSalgaCarcelSuerte(true);
                    this.getJugador(nickAPropuestar).setSalgaCarcelSuerte(false);
                    this.mensajeATodos += ";" + nickAPropuestar + "-ActualizaTarjeta-suerte";
                    this.mensajeATodos += ";" + nickOfrecio + "-ActualizaTarjeta-suerte";
                } else {
                    Casillero cas = (Casillero) casilleros.getObject(Integer.parseInt(string));
                    this.getJugador(nickOfrecio).agregarPropiedad(cas.getIdCasillero());
                    this.getJugador(nickAPropuestar).eliminarPropiedad(cas.getIdCasillero());
                    cas.setDuenio(nickOfrecio);
                    this.mensajeATodos += ";" + nickOfrecio + "-Compro-" + cas.getNombre();
                }
            }
        }
        if (!propiedadesOfrecidas[0].isEmpty()) {
            for (String string : propiedadesOfrecidas) {
                if (string.compareTo("666") == 0) {
                    this.getJugador(nickAPropuestar).setSalgaCarcelArca(true);
                    this.getJugador(nickOfrecio).setSalgaCarcelArca(false);
                    this.mensajeATodos += ";" + nickAPropuestar + "-ActualizaTarjeta-arca";
                    this.mensajeATodos += ";" + nickOfrecio + "-ActualizaTarjeta-arca";
                } else if (string.compareTo("777") == 0) {
                    this.getJugador(nickAPropuestar).setSalgaCarcelSuerte(true);
                    this.getJugador(nickOfrecio).setSalgaCarcelSuerte(false);
                    this.mensajeATodos += ";" + nickAPropuestar + "-ActualizaTarjeta-suerte";
                    this.mensajeATodos += ";" + nickOfrecio + "-ActualizaTarjeta-suerte";
                } else {
                    Casillero cas = (Casillero) casilleros.getObject(Integer.parseInt(string));
                    this.getJugador(nickAPropuestar).agregarPropiedad(cas.getIdCasillero());
                    this.getJugador(nickOfrecio).eliminarPropiedad(cas.getIdCasillero());
                    cas.setDuenio(nickAPropuestar);
                    this.mensajeATodos += ";" + nickAPropuestar + "-Compro-" + cas.getNombre();
                }
            }
        }
        this.setHaciendoAlgo(nickOfrecio, false);
        this.mensajeATodos += ";" + nickOfrecio + "-estaRealizandoUnaAccion-false";
        if (!dineroOfrecido.equals("0")) {
            this.mensajeATodos += ";" + nickOfrecio + "-Historial-le pagó a " + nickAPropuestar + " $" + dineroOfrecido;
        }
        socketServidor.enviarMensajeConParticular(mensajeEnParticular, nickOfrecio, mensajeATodos);
        resetearVariablesMensajes();
    }

    //hecho por franco
    private boolean demasPropiedadesNoHipotecadas(Propiedad p) {
        String duenio = p.getDuenio();
        LinkedList<Integer> propHnas = p.getHnos();
        for (Integer integer : propHnas) {
            Propiedad aux = ((Propiedad) casilleros.getObject(integer));

            if ((aux.getDuenio().compareTo(duenio) == 0) && p.getColor().compareTo(aux.getColor()) == 0) {
                if (p.isEsHipotecado() == true || aux.isEsHipotecado() == true) {
                    return true;
                }
            }
        }
        return false;
    }

    private int calcularSiPuedeComprar(String nickname, int precio) {
        int hipoteca, casas;
        int dineroJugador = Integer.parseInt(this.getDineroJugador(nickname));

        if (dineroJugador >= precio) {
            return 1;
        }

        hipoteca = puedeComprarHipotecando(nickname, precio);
        casas = puedeComprarVendiendoCasas(nickname, precio);

        if (hipoteca + casas > precio) {
            if (hipoteca > 0 && casas > 0) {
                return 4;
            } else if (hipoteca > precio) {
                return 2;
            } else if (casas > precio) {
                return 3;
            }
        } else if ((dineroJugador + hipoteca) > precio) {
            return 2;
        } else if ((dineroJugador + casas) > precio) {
            return 3;
        }
        return -1;
    }

}
